Java 前1000个素数之和

Java 前1000个素数之和,java,Java,我有下面的程序,我试图找到前1000个素数的和。在代码中,解决方案1和2之间的区别是什么?为什么不将count变量置于if条件之外?如果我把变量放在if之外,我显然得不到我需要的答案,但我不明白为什么它在逻辑上是错误的。这可能是一件简单的事情,但我无法理解。专家们,请帮忙 解决方案1: public class SumOfPrimeNumbers { public static void main(String[] args) { long result = 0; int num

我有下面的程序,我试图找到前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;
}
primenumbers的公共类{
公共静态void main(字符串[]args){
长结果=0;
整数=2;
整数计数=0;
同时(计数<1000){
if(checkPrime(number)=true){
结果=结果+数字;
计数++;
}
数字++;
}
System.out.println(“前1000个素数之和为”+结果);
}
公共静态布尔校验素数(整数){
for(int i=2;i
}

解决方案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;
}
公共类素数{
公共静态void main(字符串[]args){
长结果=0;
整数=2;
整数计数=0;
同时(计数<1000){
if(checkPrime(number)=true)
{
结果=结果+数字;
}               
count++;//此处的count变量已移动到循环外部。
数字++;
}       
System.out.println(“前1000个素数之和为”+结果);
}
公共静态布尔校验素数(整数){
for(int i=2;i

}

增加计数的位置非常重要。第一个代码块将前1000个素数相加,而第二个代码块将所有小于1000的素数相加。

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

if(checkPrime(number)==true)
相当于

if(checkPrime(number))
最后,在
if
之外增加计数的解决方案将非素数与素数一起计数,产生明显错误的结果

以下是您应该考虑的“风格”要点:

  • 当候选除数大于数字的平方根时,可以停止检查
    checkPrime
    中的候选除数
  • 如果您存储到目前为止看到的素数,并且只通过素数列表中的数字来检查整除性,您可以做得更好。当你在寻找前1000个素数时,这几乎不重要,但对于较大的数字,这可能很重要

在解决方案2中,
count
每次通过循环时都会递增,而不管初始测试的结果如何。所以它不是计算素数,而是计算循环中的迭代次数。因此,您将检查1000个连续的数字,而不是连续的素数(这需要通过1000多个数字进行累加)

除了其他人所指出的之外,还可以通过以下方式提高prime检查的效率:

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;
}
公共静态布尔校验素数(整数){
ints=Math.ceil(Math.sqrt(number));

对于(int i=2;我考虑重命名<代码>计数>代码> <代码> PrimeCuint < /Calp>或<代码> No.Primes发现< /代码>或类似的东西。我认为您已经混淆了您自己的命名。此外,检查此算法为Funsies:由By,前1000个素数的总和为36829。结果=结果+数目;(数字为2)。@用户2341013你是对的,我认为你的
isPrime
2
返回
false
,但它不是。确定。谢谢@dasblinkenlight我不认为这是求素数的有效方法,你最终会检查每个数以确认,最坏的情况是:测试用例很多。我想你的意思是
Math、 sqrt
。但是它非常昂贵-您可能只需要计算一次。并且您的函数返回
true
用于
169
-您可能需要
数学。round
@Dukeling是的,都是真的。谢谢您的关注。