簡體   English   中英

搜索素數的方法

[英]Method to search for prime numbers

我需要建立一種計算素數的方法。

我正在測試它,它給了我錯誤的答案,我不知道如何解決! 例如,它返回true到98262679而不是false 我的錯誤在哪里?

public static boolean itsPrime(int nbTest){   // Tests for prime numbers method

        boolean prime = false;

        if (nbTest <= 1){
             return false;
        } else if (nbTest == 2){     // Two is prime   
            return true;
        } else if ((nbTest != 2) && (nbTest % 2 == 0)){       // Evens except number 2
            return false;                                     // are not prime
        } else if (nbTest % 2 != 0){    // For all remaining odds
            for(int i = 3; i <= Math.sqrt(nbTest); i = i+2){ 
                if (nbTest % i == 0){
                    prime = false;
                } else {
                    prime = true;
                }
            }   
        }

        return prime; 
    }

我正在學習Java,我的教授要求我們構造基於此的itsPrime方法:

    For the first subtask, write a function `itsPrime` that takes an `int` 
            as argument and returns a `boolean`, `true` if the argument integer is prime 
        and `false` otherwise.

                To test whether an integer x is prime, one can proceed as follows:
                all integers less than or equal to 1 are not prime;
                2 is prime;
                all other even integers are not prime;
                for all remaining integers (obviously odd), search for a divisor:

                loop from 3 to the square root of the integer x (The square root of x can 
    be computed as ‘‘Math.sqrt(x)'' in Java.); if the remainder of the integer 
division of x by the loop index is zero, then x is not prime;
 if all remainders were non-zero at the end of the loop, then x is prime; 

您一旦在這里就應該停止:

if (nbTest % i == 0){
   return false;
}

刪除prime變量(這是不必要的步驟,請參見下文)。

更改for循環:

for(int i = 3; i <= Math.sqrt(nbTest); i = i+2){ 
    if (nbTest % i == 0){
        prime = false;
    } else {
        prime = true;
    }
}

對此:

for(int i = 3; i <= Math.sqrt(nbTest); i = i+2)
    if (nbTest % i == 0)
        return false;

如果不是素數(如果已找到一個因數),這會很早就脫離該函數。

我知道上述所有答案中都有答案,但是我認為每個答案都需要解釋。

這是您可以對代碼進行的所有增強的摘要:

1)不要聲明要返回的布爾值,因為您已經在整個代碼中返回了true或false。 從您的代碼中刪除此行(將其命名為[1]):

boolean prime = false;

修復其余功能后,您將看到為什么。 暫時將其注釋掉。

2)在第二個else if ,我們稱它為[2],您具有:

else if ((nbTest != 2) && (nbTest % 2 == 0)){
    return false;
}

您已經在第一個else if檢查了if nbTest is 2 ,因此您無需再次檢查其是否不是2。 如果輸入的第一個if else ,你的函數將返回true 當一個函數返回時,它就完成了。 它將值返回給調用方,其余代碼未執行。

因此,你可以更換第二if else ,[2],其中:

else if (nbTest % 2 == 0) { // all other even integers are not prime
    return false;
}

3)如果您輸入else if第三,則意味着上面的其余代碼已經執行,或者返回,或者程序繼續執行。

else if (nbTest % 2 != 0){對於:

else {

4)這是您真正要使函數返回錯誤答案的錯誤(調用此代碼段[4]):

if (nbTest % i == 0){
    prime = false;

如果發現要測試的數字是可分割的(即余數為零),則操作完成。 您肯定知道它不是素數。

您可以將以下代碼[4]替換為:

if(nbTest % counter == 0) {
    return false;
}

因此,返回false。 這不是數字。 並且該功能不會持續執行。 函數發現您的輸入不是素數后,您的錯誤是繼續執行。

最后,您可以在函數主體的末尾保留自己的return true 如果函數從以前的測試或循環中從未返回過,則它必須是質數。 還記得我告訴您刪除的第一行嗎? 布爾聲明? 由於您從不從變量返回值,因此只返回truefalse ,因此不需要該[1]行。

另外,您還可以閱讀有關尋找質數的好書,您可能希望與教授分享:

https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

一旦將數字的prime設置為false,就不應繼續測試primity。

更換:

if (nbTest % i == 0){
    prime = false;

有:

if (nbTest % i == 0){
    return false;

最后的測試是沒有用的,您可以保留其他基本內容:

else if (nbTest % 2 != 0){ => else {

您的for循環不正確。

質數是一個只能被1整除的數字。 因此,如果數字A可以除1和本身以外的任何其他數字整除,那么A是非質數。

只需將您的for循環替換為下面的一個

for(int i = 3; i <= Math.sqrt(nbTest); i = i+2) {
    if (nbTest % i == 0)
      return false;
}

一旦發現nbTest可被某個數整除,就沒有必要繼續循環了。 返回`nbTest是非素數,然后到那里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM