2014-09-06 42 views
1

該代碼將用戶提交的數字設置爲數組的上限。然後,它將所有元素設置爲true。之後,它遍歷數組並將所有處於非素數位置的元素設置爲false。Eratosthenes Sieve的輸出問題

然後,它打印出數組中所有真(主)元素的數字,而不是它們的索引。但是,我無法弄清楚爲什麼我的代碼打印出2,然後是用戶輸入的數字範圍內的所有奇數,因爲所有的真實元素只應該是實際的素數。

public static void main(String [] args){ 
    Scanner s = new Scanner(System.in); 
    System.out.print("Please enter the largest integer to consider: "); 
    int bounds = s.nextInt(); 
    boolean [] primes = new boolean[bounds]; 

    int j = 0; 
    for(int i = 2; i < primes.length; i++) { 
     primes[i] = true; 
    } 

    for(int x = 2; x < primes.length; x++) { 
     for(int n = 2; j < primes.length; n++) { 
      j = n * x; 
      if(j < primes.length) { 
       primes[j] = false; 
      } 
     } 
    } 

    for(int k = 0; k < primes.length; k++) { 
     if(primes[k]) { 
      System.out.println(k); 
     } 
    } 
} 
+2

啓動你的調試,並開始工作。 – 2014-09-06 00:24:12

+0

Stack Overflow的一個壞處是它鼓勵人們不要學習使用他們的調試器。用調試器找到答案需要花費幾秒鐘,但Stack Overflow看起來似乎更容易。 – 2014-09-06 00:28:24

回答

2

您正在使用jx倍數設定爲false。這適用於第一個循環,當x2,但j未被重置爲接下來的x循環,並且nfor循環未被重新輸入,因此您可以打印所有奇數。

重設jx在進入jfor環之前。

for(int x = 2; x < primes.length; x++){ 
    j = x; 
    for(int n = 2; j < primes.length; n++){ 

輸出爲100輸入:

2 
3 
5 
7 
11 
13 
17 
19 
23 
29 
31 
37 
41 
43 
47 
53 
59 
61 
67 
71 
73 
79 
83 
89 
97 
+0

工作就像一個治療! – Historiun 2014-09-06 15:35:53