查找2000000以下所有素数之和的Java程序(Euler项目)

查找2000000以下所有素数之和的Java程序(Euler项目),java,Java,我正试图解决欧拉计划的第十个问题,但由于某种原因,我没能把它做好。我对编程和Java非常陌生,所以我不明白它为什么不起作用。问题的关键是找出所有素数之和在2000000以下 /* The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. Find the sum of all the primes below two million. */ public static void main(String[] args){

我正试图解决欧拉计划的第十个问题,但由于某种原因,我没能把它做好。我对编程和Java非常陌生,所以我不明白它为什么不起作用。问题的关键是找出所有素数之和在2000000以下

/*  The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

    Find the sum of all the primes below two million.
*/  

public static void main(String[] args){

    long n = 1;
    long sum = 0;
    long limit;

    System.out.println("Enter the limit of n: ");
    limit = TextIO.getlnLong(); //TextIO is another input method
    while (limit <= 0){
        System.out.println("Enter the limit of n (must be positive): ");
        limit = TextIO.getlnLong();

    }       

    while (n < limit){ 
        n++;
        if (n % 2 != 0 && n % 3 != 0 && n % 5 != 0 && n % 7 != 0 && n != 1 || n == 2 || n == 3 || n == 5 || n == 7){ //this is my prime checking method, might be flawed

            sum = sum + n;  
            System.out.println(+sum);
        } //end if

    }//end while

    System.out.println("The sum of the primes below 2,000,000 is: " +sum);

} //end of main
/*10以下的素数之和为2+3+5+7=17。
求200万以下所有素数之和。
*/  
公共静态void main(字符串[]args){
长n=1;
长和=0;
长限;
System.out.println(“输入n的限制:”);
limit=TextIO.getlnLong();//TextIO是另一个输入方法

而(limit对于有效的素数检查方法,请阅读。

对于有效的素数检查方法,请阅读。

您的素数方法已被破坏。如果一个数字的除数不在2和该数字的平方根之间,则该数字为素数。13*13将通过素数检查函数

for i to sqrt(n):
   if(n % i == 0):
       OH NO NOT PRIME DO SOMETHING HERE?
if something is prime
   add some stuff

素数方法已损坏。如果一个数在2和该数的平方根之间没有任何除数,则该数为素数。13*13将通过素数检查函数

for i to sqrt(n):
   if(n % i == 0):
       OH NO NOT PRIME DO SOMETHING HERE?
if something is prime
   add some stuff
publicstaticvoidmain(字符串参数[])
{
长n=1;
长和=0;
long limit=Integer.parseInt(args[0]);
while(n
公共静态void main(字符串参数[])
{
长n=1;
长和=0;
long limit=Integer.parseInt(args[0]);
while(n
以下是两种比普通解决方案更好的解决方案:

1)遍历奇数(总和中已存在唯一的偶数素数),并检查它们是否为素数:

private static boolean isOddPrime(int x) {
    for ( int i = 3 ; i*i <= x ; i+=2 ){ 
        if ( x % i == 0 ) {
            return false;
        }
    }
    return true;
}

private static void sumOfPrimes1(int n) {       
    long sum = 2;
    for ( int i = 3 ; i < n ; i+=2 ) {
        if ( isOddPrime(i) ) {
            sum+=i;
        }
    }
    System.out.println(sum); 
}

以下是两种比普通解决方案更好的解决方案:

1)遍历奇数(总和中已存在唯一的偶数素数),并检查它们是否为素数:

private static boolean isOddPrime(int x) {
    for ( int i = 3 ; i*i <= x ; i+=2 ){ 
        if ( x % i == 0 ) {
            return false;
        }
    }
    return true;
}

private static void sumOfPrimes1(int n) {       
    long sum = 2;
    for ( int i = 3 ; i < n ; i+=2 ) {
        if ( isOddPrime(i) ) {
            sum+=i;
        }
    }
    System.out.println(sum); 
}

检查一个数N是否为素数的一条捷径是,我们不必从2到N(2,3,4,5,6…N-1)依次尝试每个数,就可以看到它们中的任何一个正好除以N

实验:因为3是18的因子,18/3=6,那么18=3x6。我们只需要测试较小的数字3,看看它是否是18的因子,而不是6。同样,5是因子20,20=5x4,所以我们只需要测试较小的数字4作为因子。但是如果我们不知道一个数字的因子呢?那么,测试一个数字是否是素数意味着我们只需要测试“较小”的因素。但较小的因素从何处停止,较大的因素从何处开始?这里的原则是: 假设一个数字是N的一个因子,并且它小于数字N的平方根。那么第二个因子必须大于平方根。 我们可以通过上面的例子看到这一点:对于18,我们只需要测试18的平方根以下的数字,即4.243!这比测试所有17的数字要快得多!! 对于25,我们需要测试25的平方根以下的数字,即5。 对于37,我们只需要增加到6(因为6x6=36,所以37的平方根只会稍微大一点)

publicstaticvoidmain(字符串[]args){
长和=0;
对于(int i=2;i<2000000;i++){
如果(i){
总和+=i;
}
}
系统输出打印项数(总和);
}
//检查一个数字是否为素数
专用静态布尔值iPrime(整数){
intsqrt=(int)Math.sqrt(number);
布尔值isPrime=true;
//测试数字的平方根
对于(inti=2;i

检查一个数N是否为素数的一条捷径是,我们不必从2到N(2,3,4,5,6…N-1)依次尝试每个数,就可以看到它们中的任何一个正好除以N

实验:因为3是18的因子,18/3=6,那么18=3x6。我们只需要测试较小的数字3,看看它是否是18的因子,而不是6。同样,5是因子20,20=5x4,所以我们只需要测试较小的数字4作为因子。但是如果我们不知道一个数字的因子呢?那么,测试一个数字是否是素数意味着我们只需要测试“较小”的因素。但较小的因素从何处停止,较大的因素从何处开始?这里的原则是: 假设一个数字是N的一个因子,并且它小于数字N的平方根。那么第二个因子必须大于平方根。 我们可以通过上面的例子看到这一点:对于18,我们只需要测试18的平方根以下的数字,即4.243!这比测试所有17的数字要快得多!! 对于25,我们需要测试25的平方根以下的数字,即5。 对于37,我们只需要增加到6(因为6x6=36,所以37的平方根只会稍微大一点)

publicstaticvoidmain(字符串[]args){
长和=0;
对于(int i=2;i<2000000;i++){
如果(i){
总和+=i;
}
}
系统输出打印项数(总和);
}
//检查一个数字是否为素数
专用静态布尔值iPrime(整数){
intsqrt=(int)Math.sqrt(number);
布尔值isPrime=true;
//测试数字的平方根

对于(int i=2;i)你的素数检查方法肯定有缺陷。我还建议将素数检查分解成一个单独的方法。这里有一个经过验证的方法,你可以使用。121=11*11。这不是素数……完美的平方,是的。每当你发表这样的文章时,请非常清楚地陈述你的问题。尽管人们可以编译和运行代码,并看到问题所在在你的帖子中,最好清楚地指出你的程序是不是正在编译或者你得到了一些错误的答案
n           |    2000000        8000000       16000000
------------+-------------------------------------------
Solution 1  |    1309 ms        8574 ms       22757 ms
Solution 2  |    119 ms         696 ms        1624 ms
public static void main(String[] args) {
    long sum = 0;
    for (int i = 2; i < 2000000; i++) {
        if (isPrime(i)) {
            sum += i;
        }
    }
    System.out.println(sum);
}

// check if a number is prime
private static boolean isPrime(int number) {
    int sqrt = (int) Math.sqrt(number);
    boolean isPrime = true;

   // test up to square root of the number
   for (int i = 2; i <= sqrt; i++) {
        if (number % i == 0) {
            isPrime = false;
            break;
        }
    }
    return isPrime;
}