2014-01-30 33 views
-11

我缺少輸出中的素數2和3。缺少Prime中的2和3

public static ArrayList<Integer> findPrimes(int n){ 

    ArrayList<Integer> primes = new ArrayList<Integer>(); 

    for (int i = 2; i < n; i++){ 

     for(int x = i - 1; x > 2; x--) 

      if(i % x == 0) 
       break; 
      else if(x == 3 && i != 4) 
       primes.add(i); 
     } 
    return primes; 
} 

當我把n = 72,它打印好,但2和3不被輸出。我不知道爲什麼它一直在打印。任何幫助都會很棒。如下所示。

輸出:

Prime numbers: 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 

謝謝!如果你有另一種方式,隨時拋出,我可以學習的東西。非常感謝!

回答

4

你的代碼解釋了這個問題。第二個for循環將在其執行一次之前終止,因爲對於值3和以下,條件始終爲假。

第一次循環運行:i = 2,x = 1,1不大於2,所以循環不運行。 第二次運行:i = 3,x = 2,2不超過2,所以再一次,同樣的priblem。

4

當i = 2或i = 3時,x將初始化爲1或2,因此它將永遠不會進入嵌套for循環(因爲x> 2未滿足),因此primes.add(i)將不會執行。

提示:一種更好的方式來打印質數2,...,N是用篩方法:https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

4

編輯:重新評估後,我意識到你的邏輯是有點過貫穿始終。該代碼實際上應該是:

for (int i = 2; i < n; i++){ 

    for(int x = 2; x <= i; x++) 

     if(i == x) 
      primes.add(i); 
     else if(i % x == 0) 
      break; 
} 

經過測試,它似乎工作正常。

+0

有趣...所以,我將不得不用其他東西替換2? – Singh2013

+0

是的,看到上面的內容,您需要用'0'代替'2' –

+0

感謝您的快速回復。但是,它仍然打印出相同的輸出。 – Singh2013

0

當i = 2或3時,x是< 2並且內部for循環未執行。

我會改變X到2計數:

for (int i = 2; i < n; i++){ 
    for(int x = 2; x <= i; x++) 
     if(x == i) 
      primes.add(i); 
     else if (i % x == 0) 
      break; 
    } 
return primes; 

}

打字這一點在iPhone上是可怕的。

0

Inner for循環將不會執行小於2的值。所以,您必須初始化x = 2;在內部for循環。

對(INT X = 2; X < = I; X ++)

嘗試此。