2014-09-06 64 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