[英]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
。 如果函數從以前的測試或循環中從未返回過,則它必須是質數。 還記得我告訴您刪除的第一行嗎? 布爾聲明? 由於您從不從變量返回值,因此只返回true
或false
,因此不需要該[1]行。
另外,您還可以閱讀有關尋找質數的好書,您可能希望與教授分享:
一旦將數字的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.