繁体   English   中英

前1000个质数之和

[英]Sum of first 1000 prime numbers

我在下面的程序中尝试查找前1000个质数的总和。 在代码中,解决方案1和2有什么区别? 为什么不将count变量放在if条件之外? 如果将变量放在if之外,显然我没有得到所需的答案,但是我不明白为什么它在逻辑上是错误的。 这可能很简单,但是我无法弄清楚。 专家,请帮忙。

解决方案1:

public class SumOfPrimeNumbers {
public static void main(String[] args) {
    long result = 0;
    int number = 2;
    int count = 0;
    while (count < 1000) {
        if (checkPrime(number) == true) {
            result = result + number;
            count++;
        }
        number++;
    }
    System.out.println("The sum of first 1000 prime numbers is " + result);
}

public static boolean checkPrime(int number) {
    for (int i = 2; i < number; i++) {
        if (number % i == 0) {
            return false;
        }
    }
    return true;
}

}

解决方案2:

public class SumOfPrimeNumbers {    
public static void main(String[] args) {
    long result = 0;
    int number = 2;
    int count = 0;
    while (count < 1000) {
        if(checkPrime(number)==true)
        {
        result = result + number;                       
        }               
        count++; //The count variable here has been moved to outside the loop.
        number++;
    }       
    System.out.println("The sum of first 1000 prime numbers is "+ result);
}

public static boolean checkPrime(int number) {
    for (int i = 2; i < number; i++) {
        if (number % i == 0) {
            return false;
        }
    }       
    return true;
}

}

您不应该检查bool函数的返回值是否等于true :此行

if(checkPrime(number)==true)

相当于

if(checkPrime(number))

最后,在if之外将计数加非质数与质数一起计数的解决方案,产生明显错误的结果。

这是您应该考虑的“针对样式”的几点:

  • 当候选除数大于数字的平方根时,可以检查checkPrime中的候选除数
  • 如果存储到目前为止已经看到的素数,并且仅通过素数列表中的数字检查可除性,则可以做得更好。 当您寻找前1000个素数时,这几乎无关紧要,但是对于较大的数字,这可能很重要。

递增count位置非常重要。 您的第一个代码块将前1000个素数加起来,而第二个则将所有小于1000的素数加起来。

在解决方案2中,无论主要测试的结果如何, count都会在循环中每次增加。 因此,它不是在计算素数,而是在循环中计算迭代次数。 结果,您将检查1,000个连续的数字,而不是连续的质数(这涉及到要累加的1,000个数字)。

除了其他人指出的以外,您可以通过以下方法使检查质数的效率更高:

public static boolean checkPrime(int number) {
    int s = Math.ceil(Math.sqrt(number));

    for (int i = 2; i <= s; i++) {
        if ((number % i) == 0) {
            return false;
        }
    }       
    return true;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM