我有以下程序,我试图找到前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;
}
}
答案 0 :(得分:4)
您不应该检查bool
函数的返回值是否与true
相等:此行
if(checkPrime(number)==true)
相当于
if(checkPrime(number))
最后,计数在if
之外递增的解决方案将非素数与素数一起计算,产生明显错误的结果。
您应该考虑以下几点“风格”:
checkPrime
中的候选除数可以停止答案 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;
}