Eratosthenes筛子不会筛选Prime数字

时间:2017-06-12 22:30:52

标签: java for-loop sieve-of-eratosthenes

对于我正在为我的一个班级做的任务,我们必须实施一个Eratosthenes筛选。我已经尝试了七次以获得一个有效的代码并尝试合并我研究过的众多解决方案。我终于有一个会输出数字。不幸的是,它打印复合数和素数,并且不打印2。

我的代码如下:

public class EratosthenesSieveAttempt6 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Scanner keyboard = new Scanner(System.in);
        int limit;

        System.out.print("Please enter the highest number to check "
                + "(number must be greater than 2): ");

        limit = keyboard.nextInt();

        while (limit <= 2){
          System.out.println("Error - number must be greater than 2.");
          System.out.println("Please enter the highest number to check: ");
          limit = keyboard.nextInt();
        }

        boolean[] numbers = new boolean[limit + 1];
        int newPrime = 2;

        for(int i = 0; i < limit + 1; i++){
          numbers[i] = true;       
        }

        for(int j = 1; j < limit + 1; j++) {
          if (j % 2 == 0) {
           numbers[j] = false;   
           }

        for(int k = j + 1; k < limit + 1; k++) {
           if(numbers[k] == true){
             j = k;

        System.out.println(k);
               }
            }
         }
       }
    }

我怀疑我的循环有问题。我为前两个循环修复了ij变量,以便从2开始打印出来,问题似乎是在我初始化之后它没有将复合数字标记为false数组到true

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这是我前几天写的Eratosthenes筛子的实施:

import java.util.BitSet;

public static BitSet composite(int max) {
    BitSet composite = new BitSet(max);
    max = composite.size();
    for (int i = 4; i < max; i += 2) composite.set(i, true);
    for (int i = 9; i < max; i += 6) composite.set(i, true);
    int p = 5;
    while (p*p < max) {
        if (!composite.get(p)) {
            for (int i = p*p; i < max; i += p*2) composite.set(i, true);
        }
        p += 2;
        if (p*p >= max) break;
        if (!composite.get(p)) {
            for (int i = p*p; i < max; i += p*2) composite.set(i, true);
        }
        p += 4;
    }
    return composite;
}

注意:

  • BitSet分配64位字,因此大小可能比您要求的大(例如,如果要求它达到1000,它将达到1024;这就是{{{0}的原因1}}靠近顶部)
  • 明确地获取2&#39; s,然后
  • 依赖于大于3的所有素数与1或5 mod 6一致的事实;这就是最终循环在添加2和4之间交替的原因

返回max = composite.size(),告诉您哪些数字是复合数。从中提取素数的一种方法是:

BitSet