2016-04-10 45 views
-1

循環爲素數的驗證,我不明白這「for」循環本環路只是爲了檢查一個數是素數或不。我理解第一個陳述,因爲1不是素數,但它是'for'語句中發生的。爲什麼'primeNumber'除以2,爲什麼第二個'if'計算餘數爲零?這段代碼如何幫助確認素數?它在做什麼?我不明白這一點在Java中</p> <p>「的」在Java中

public static boolean isPrime (int primeNumber) { 

    if (primeNumber == 1) { 
     return false; 
    } 

    for (int primeDivider=2; primeDivider <= primeNumber/2; primeDivider++) { 

     if (primeNumber % primeDivider == 0) { 
      return false; 
     } 

    } 

    return true; 

} 
+0

檢查來自2-> num/2的數字是否沒有餘數分成num(正在測試的數字)。 – Deximus

+0

這個問題對於StackOverflow並不是很合適。嘗試瀏覽網頁上的任何其他數學資源,以瞭解質數如何工作。 –

+1

您如何確定一個數字是否爲總數?幾乎肯定會這樣做,只需稍加優化即可。當檢查563是否爲素數時,你會嘗試除以2,3,4,5,6等等嗎?只有當你檢查了它是否可以被2整除時,你不需要檢查它是否可以被563/2或更多整除,是嗎?提示...您可以用Math.floor替換primeNumber/2(Math.sqrt(primeNumber)) – billjamesdev

回答

0

質數只能由自己和一個分開。 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以外,小於或等於其平方根。

相關問題