埃氏筛法--素数快速筛选法
埃氏筛法的核心是一遍遍地将合数筛选掉,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"); } }
浙公网安备 33010602011771号