Java 所有素数之和小于200万

Java 所有素数之和小于200万,java,primes,Java,Primes,我试图找出所有小于2000000的素数之和,但它给出了错误的答案。如何改进代码? 我得到的答案是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) ret

我试图找出所有小于2000000的素数之和,但它给出了错误的答案。如何改进代码? 我得到的答案是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);
    }
}

int值只会上升到2^32,因此您有溢出。您必须使用long,它最多可以达到2^64


此外,只需在一个多达200万个值的列表上使用一个筛子,就可以更简单地找到所有的素数,从而使算法更加高效。然后通过筛子,把所有找到的素数加起来。为了更高的速度和更简单的代码,您可以牺牲内存。

一个更好的解决方案将在时间复杂度方面起作用,我们得到的所有素数都小于n,然后我们可以将它们相加。

可能是整数溢出吗?试着用long求和。此外,使用质数筛选方法会更有效。你会希望你的问题更加具体。a我们不知道它给出了什么错误的答案,b人们通常不希望只是随机阅读大量源代码,猜测出了什么错误,然后为他们不认识的人重写它。告诉我们到底出了什么问题,采取了什么形式,只给我们相关的源代码片段,而不是全部。@tobias_k谢谢你的帮助。这是Euler项目,问题10。@masukomi我是java新手,如果我能告诉你这段代码出了什么问题,那么我为什么会问这个问题。谢谢你的帮助,我将变量sum从int改为long。