最近看《java核心技术》看到集合章节,在最后位集(BitSet)部分给出了一个示例程序,使用了埃拉托色尼筛选法(Eratosthenes Sieve)求自然数2~n范围的所有素数
代码如下:
import java.util.BitSet;
public class Sieve {
public static void main(String[] args) {
int n = 2000000;
long start = System.currentTimeMillis();
BitSet bitSet = new BitSet(n+1); //开辟2000001位的位集空间,从0位开始
int count = 0; //记录素数个数
int i;
for(i=2; i<=n; i++) {
bitSet.set(i); //将所有位置“开”状态(置1)
}
i = 2;
while(i*i <= n) { //从i=2开始遍历小于等于根号n所有整数
if(bitSet.get(i)) { //如果是素数
count++; //count增加
int k = 2 * i; //k为素数i的倍数,所以为合数,初始化为2倍
while(k <= n) {
bitSet.clear(k); //清除位集中的第k位,置为“关”状态(置0)
k += i; //k倍增
}
}
i++; //i递增,最终增至大于根号n的最小整数
}
while(i <= n) {
i