[英]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
中的候選除數 遞增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.