質數只能由自己和一個分開。 7是素數,因爲只有1和7分爲7.還有8不是素數,因爲以及1和8,2和4都分爲8.
看看for
循環,看看primeDivider
取值爲:2 ,3,4,5,...循環會依次嘗試每一個,看看它是否分爲您正在測試的數字。如果它均勻分配,餘數爲0,則被測試的數字不是素數,方法返回false
。如果沒有數字分開,那麼在素數中進行測試的數字將返回true
。順便說一句,primeNumber
是一個不好的變量名稱。像possiblePrime
會更好。被測試的號碼可能不是主要的。
primeDivider
序列停止在正在測試的數字的一半。如果一個數不是素數(合數),則至少有一個除數保證小於或等於數的一半。
正如其他人所說,這不是一個非常有效的測試。這裏有一個稍微更高效的版本供您學習:
public static boolean isPrime (int possiblePrime) {
// Test negatives, zero and 1.
if (possiblePrime <= 1) {
return false;
}
// Test even numbers
if (possiblePrime % 2 == 0) {
// 2 is the only even prime.
return possiblePrime == 2;
}
// Test odd numbers >= 3.
int limit = possiblePrime/2;
for (int primeDivider = 3; primeDivider <= limit; primeDivider += 2) {
if (possiblePrime % primeDivider == 0) {
return false;
}
}
// Only prime numbers reach this point.
return true;
}
通過單獨治療單雙號,你可以捕捉所有的甚至一個單獨的測試,並通過2每次步進primeDivider
數字,大致減半奇數的時間。
作爲billjamesdev說,可以甚至更高效利用做出:
int limit = (int)Math.floor(Math.sqrt(possiblePrime));
的複合數將總是具有一個除數,除1以外,小於或等於其平方根。
檢查來自2-> num/2的數字是否沒有餘數分成num(正在測試的數字)。 – Deximus
這個問題對於StackOverflow並不是很合適。嘗試瀏覽網頁上的任何其他數學資源,以瞭解質數如何工作。 –
您如何確定一個數字是否爲總數?幾乎肯定會這樣做,只需稍加優化即可。當檢查563是否爲素數時,你會嘗試除以2,3,4,5,6等等嗎?只有當你檢查了它是否可以被2整除時,你不需要檢查它是否可以被563/2或更多整除,是嗎?提示...您可以用Math.floor替換primeNumber/2(Math.sqrt(primeNumber)) – billjamesdev