所有素数不足200万的总和

时间:2017-05-28 12:46:24

标签: java primes

我试图找出所有低于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);
    }
}

2 个答案:

答案 0 :(得分:1)

int只能达到2 ^ 32,所以你有溢出。你必须使用长达2 ^ 64的长。

此外,在最多200万的值列表上使用筛子来查找所有素数(更有效的算法)更简单。然后通过筛子,总结所有发现的素数。您需要权衡内存以获得更快的速度和更简单的代码。

答案 1 :(得分:0)

更好的解决方案将是Sieve,它可以解决O(n)时间复杂性的问题,我们得到的所有质数都小于n,然后我们可以将它们相加。