【发布时间】:2013-05-28 12:22:38
【问题描述】:
来自 Project Euler 的问题 10:
该程序针对较小的数字运行,并在数十万中缓慢爬行。 在 200 万时,即使程序似乎仍在运行,也无法显示答案。
我正在尝试实施埃拉托色尼筛法。它应该非常快。我的方法有什么问题?
import java.util.ArrayList;
public class p010
{
/**
* The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17
* Find the sum of all the primes below two million.
* @param args
*/
public static void main(String[] args)
{
ArrayList<Integer> primes = new ArrayList<Integer>();
int upper = 2000000;
for (int i = 2; i < upper; i++)
{
primes.add(i);
}
int sum = 0;
for (int i = 0; i < primes.size(); i++)
{
if (isPrime(primes.get(i)))
{
for (int k = 2; k*primes.get(i) < upper; k++)
{
if (primes.contains(k*primes.get(i)))
{
primes.remove(primes.indexOf(k*primes.get(i)));
}
}
}
}
for (int i = 0; i < primes.size(); i++)
{
sum += primes.get(i);
}
System.out.println(sum);
}
public static boolean isPrime(int number)
{
boolean returnVal = true;
for (int i = 2; i <= Math.sqrt(number); i ++)
{
if (number % i == 0)
{
returnVal = false;
}
}
return returnVal;
}
}
【问题讨论】:
-
也许你的内存快用完了?
-
埃拉托色尼筛的实施很糟糕。请参考wikipedia link 并查看 gif 示例。
-
在
isPrime()方法中,您可以只检查所有主要分隔符(最多sqrt(number))。如果一个数不是素数,它将被素数整除(如果不能被 2 或 3 整除,则不能被 6 整除)。 -
这不是筛子的低效实施。它只是一个蛮力的主要测试者。
-
@SJuan76:这就是 {he,she} 正在尝试做的事情,但循环被严重破坏:应该在第一次成功测试时返回 false。如果仅测试奇数除数,可能会快 50%。将素数存储在位图中可能会快很多 (long[])
标签: java primes sieve-of-eratosthenes