扫描仪不工作 - Prime Sieve。代码完成了

时间:2014-02-06 21:10:56

标签: java algorithm java.util.scanner

我正在研究PrimeSieve的arraylist实现,我已经编写了所有代码,但似乎没有运行,所以我不确定是不是因为循环不好或者因为我设置了扫描器错误。

这是代码。

import java.util.Scanner;
import java.util.ArrayList;


public class PrimeSieve {

 public static void main(String[] args)
 {
     int inputNum;
     Scanner SL = new Scanner(System.in);
     System.out.print("Pick a number to count up from:");
     inputNum = SL.nextInt();
     ArrayList<Boolean> BL = findPrime(inputNum);
     System.out.println("The prime numbers found:");
     for(int i = 0; i < inputNum; i++)
     {
         if(BL.get(i) == true)
         {
             System.out.println(i + ", ");
         }
     }
 }

 public static ArrayList<Boolean> findPrime(int maxNum)
 {
     ArrayList<Boolean> BL = new ArrayList<Boolean>();


     //Filling in the list.
     for(int i = 0; i < maxNum;  i++)
     {
         BL.add(true);

     }

     for(int i = 0; i * i <(maxNum); i++)
     {
         if(BL.get(i) == true)
         {
             for(int k = i*2; k < maxNum; k = k + i)
             {
                 BL.set(i, false);
             }
         }

     }
     return BL;


 }

}

输入任何数字后按回车键,无效。我的假设是程序在某个地方不断循环而且必须被打破。

2 个答案:

答案 0 :(得分:4)

你在这里有无穷无尽的循环:

for(int k = i*2; k < maxNum; k = k + i)

i为0,k为0,因此每一步k=0+0

答案 1 :(得分:1)

有你的问题:

for (int i = 0; i * i < (maxNum); i++) {
    if (BL.get(i) == true) {
        for (int k = i * 2; k < maxNum; k = k + i) {
            BL.set(i, false);
        }
    }
}

第一次迭代(i = 0):

for (int k = 0 * 2; k < maxNum; k = k + 0)

就像:

for (int k = 0 ; k < X ; k = k + 0 )

修复它:)

关于你的问题...这很容易(使用debug :)):

for (int i = 2; i * i < (maxNum); i++) {
    if (BL.get(i) == true) {
        for (int k = i * 2; k < maxNum; k = k + i) {
            BL.set(k, false);
        }
    }

}

更改:

int i = 2; 

BL.set(k,false);

你必须自己学习:(