我们知道,利用Java平台的位集BitSet类存放位序列比较高效,因为该位集是将各个位包装在字节中的。BitSet类使用起来也很方便,因为它提供了
对各个位进行读取、设置或者清除等操作接口。利用这些接口,可以避免屏蔽以及其他麻烦的位操作。
利用BitSet类,Eratoshenes 筛选素数的方法的主要思路是():
1、首先打开所有的位;
2、将素数倍数的所有位都关闭;
3、经过1与2操作之后保留下来的那些位的位置就是素数。
import java.util.*;
/**
* This program runs the Sieve of Eratosthenes banchmark. It computes all primes
* up to 2,000,000.
*
*/
public class Sieve {
public static void main(String[] args) {
int n = 2000000;// 这里只筛选2~2000000之间的素数
long start = System.currentTimeMillis();// 开始计时
BitSet b = new BitSet(n + 1);// 因为BitSet是从0开始计数的,所以包括n在内应该加1
int count = 0;// 用于记录素数的个数
/**
* 首先打开所有的位
*/
int i;
for (i = 2; i <= n; i++) {
b.set(i);
}
/**
* 将素数倍数的所有位都关闭
*/
i = 2;
while (i * i <= n) {//只要试验n的开方次就足够了
if (b.get(i)) {
count++;
int k=2*i;
/**
* i=2时,k=4,6,8,……第一轮即把所有偶数位置上的位调至”关“的状态
* i=3时,k=6,9,12,……
*/
while(k<=n){
b.clear(k);
k+=i;
}
}
i++;
}
/**
* 计数剩下的素数
*/
while(i<=n){
if(b.get(i))
count++;
i++;
}
long end=System.currentTimeMillis();
System.out.println(count+" primes");
System.out.println((end-start)+" milliseconds");
}
}
运行结果:
148933 primes
250 milliseconds