我试图找出所有低于2,000,000的素数的总和,但它给出了错误的答案。如何改进我的代码? 我的答案是1179908154,但原始答案是142913828922。
public class main {
static boolean isPrime(int n) {
if (n%2==0) return false;
for(int i=3;i*i<=n;i+=2) {
if(n%i==0)
return false;
}
return true;
}
public static void main( String[] args) {
int sum=2;
for (int j=3;j<2_000_000;j=j+2){
if(isPrime(j))
sum+=j;
}
System.out.println("SUM : "+sum);
}
}
答案 0 :(得分:1)
int只能达到2 ^ 32,所以你有溢出。你必须使用长达2 ^ 64的长。
此外,在最多200万的值列表上使用筛子来查找所有素数(更有效的算法)更简单。然后通过筛子,总结所有发现的素数。您需要权衡内存以获得更快的速度和更简单的代码。
答案 1 :(得分:0)
更好的解决方案将是Sieve,它可以解决O(n)
时间复杂性的问题,我们得到的所有质数都小于n
,然后我们可以将它们相加。