簡體   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