前1000个素数之和

时间:2013-06-08 00:46:17

标签: java

我有以下程序,我试图找到前1000个素数的总和。在代码中,解决方案1和2之间有什么区别?我为什么不把count变量放在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;
}

}

3 个答案:

答案 0 :(得分:4)

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

if(checkPrime(number)==true)

相当于

if(checkPrime(number))

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

您应该考虑以下几点“风格”:

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

答案 1 :(得分:3)

增加count的地方非常重要。你的第一个代码块加起来是前1000个素数,而第二个代码块加起来所有小于1000的素数。

答案 2 :(得分:1)

在您的解决方案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;
}