2015-10-05 31 views
-1

任何想法爲什麼這個方法爲'4'返回true?爲什麼我的程序認爲4是一個素數?

private boolean isPrime(int num) { 
      if (num < 2) { 
       return false; 
      } 
      for (int i = 2; i < num/2; i++) { 
       if (num % i == 0) 
        return false; 
      } 
      return true; 
} 
+1

我確定你的調試器可以幫助你調試你的程序。如果你不知道如何使用你的調試器,我建議你學習。 –

+1

順便說一句,更有效的方法是執行'for(int i = 2,max =(int)Math.sqrt(num); i <= max; i ++)'您可以通過檢查後僅檢查奇數來進一步改進'2'是一個因素。在這種情況下, –

+0

總是傾向於調試。 –

回答

4

,因爲你的循環從2開始,在num/2 -1這在num = 4的情況下1結束返回TRUE。這意味着你永遠不會進入for循環。

for迴路應

for (int i = 2; i <= num/2; i++) 

注意,你的循環運行時間將O(num)。對於更高的效率,你可能要考慮循環

for (int i = 2; i * i <= num; i++) 

這是O(sqrt(num))

1

它正在返回true因爲控制永遠不會進入for循環內部。

for(int i = 2; i < num/2; i++) { ... } 

這裏num4然後num/22

for(int i = 2; i < 2; i++) { ... } 

,最初我是2這是不小於2。所以i < 2會給假。
所以你的循環永遠不會運行。並且函數將返回true

3

更有效的解決方案是檢查2後跟奇數到sqrt(n),因爲上面的任何數字都意味着有一個小於這個的因子。

static boolean isPrime(long num) { 
    if (num < 2) return false; 
    if (num == 2) return true; 
    if ((num & 1) == 0) return false; // must be even 
    for (int i = 3, max = (int) Math.sqrt(num); i <= max; i += 2) 
     if (num % i == 0) 
      return false; 
    return true; 
} 
+0

@Meehm謝謝你。 –

+0

當你通過'2'時,這會返回什麼? – Blastfurnace

+0

@Blastfurnace謝謝。我修好了。 –

相關問題