【发布时间】:2010-08-03 18:16:17
【问题描述】:
所以,我正在尝试用 Java 解决 Project Euler Problem 10,但我得到的答案不是正确的。这是我的代码:
public class Problem10 {
public static void main(String[] args)
{
long sum =0;
for(int i =3;i<2000000;i+=2)
{
if(isPrime(i))
{
sum+=i;
}
}
System.out.println(sum);
}
public static boolean isPrime(int n)
{
boolean prime = true;
if (n<2) return false;
if (n==2) return true;
if (n%2==0) return false;
for (int i = 3; i<=Math.sqrt(n);i+=2)
{
if (n%i==0)
{
prime=false;
break;
}
}
return prime;
}
}
打印出 142913828920,Euler 告诉我的项目是错误的。
有什么想法吗?
(另外,我知道我寻找素数的方法非常低效。)
【问题讨论】:
-
这种方法并不是非常效率低下。在 Haskell 中,它是
2 : [n | n<-[3,5..], all ((> 0).rem n) [3,5..floor(sqrt(fromIntegral n))]]- 奇数的最小试除法。以下 非常低效,并且流行:sieve [2..] where sieve (x:xs) = x : sieve [n | n <- xs, rem n x > 0]- 过度试除以素数。[n | n<-[2..], all ((> 0).rem n) [2..n-1]]更慢但也很受欢迎 - 所有数字的过度试验划分。[n | n<-[2..], not $ elem n [j*k | j<-[1..n-1], k<-[1..n-1]]]是冠军 - 我在 SO 上看到它(在 Java IIRC 中)!