埃氏筛法--素数快速筛选法

埃氏筛法的核心是一遍遍地将合数筛选掉,1不算,1既不是素数也不是合数,从2开始计算

(1)先将所有数都假设为素数

(2)第一个素数为2,将所有2的倍数排除掉,如果最大的数小于2的平方,则剩下的数都是素数,否则进行下一步

(3)找出下一个素数,将所有该素数的倍数排除掉,如果最大的数小于该素数的平方,则剩下的数都是素数,否则重复这一步骤,直到结束

public class Sieve {
    public static void main(String[] args){
        int n = 2000000;
        long start = System.currentTimeMillis();
        BitSet b = new BitSet(n+1);
        int count = 0;
        int i;
        for(i = 2; i<=n; i++){
            b.set(i);
        }
        i = 2;
        while(i*i<=n){/*sqrt(n),思考为什么是到这个数后面的数就都确定了,在往上加的话,相对于i的另一个数就是比i小的数,计算重复*/
            if(b.get(i)){//如果该位是质数
                count++;
                int k=2*i;
                while(k<=n){
                    b.clear(k);
                    k+=i;//k是i的倍数,将第k位移除
                }
            }
            i++;
        }
        while(i<=n){//计算sqrt(n)后面的数
            if(b.get(i)){
                count++;
            }
            i++;
        }
        long end = System.currentTimeMillis();
        System.out.println(count + "primes");
        System.out.println((end - start) + "milliseconds");
    }
}

 

posted on 2015-07-06 22:22  PlusYep  阅读(405)  评论(0)    收藏  举报

导航