从2开始,删除所有2的倍数的数。
然后是3,5,7,...
下一次循环进行时的第一个数一定是素数。
只进行sqrt(n)次循环,因为一个数的约数只在sqrt(n)这个范围内。
import java.util.BitSet;
import java.util.LinkedList;
import java.util.List;
public class Test {
public static void main(String[] args) {
int n = 100;
BitSet b = new BitSet(n + 1);
List<Integer> primes = new LinkedList<Integer>();
int i = 0;
for (i = 2; i <= n; ++i) {
b.set(i); // 设置此位置上的位为1
}
i = 2;
int k = 0;
while (i * i <= n) {
if (b.get(i)) {
primes.add(i);
k = 2 * i;
while (k <= n) {
b.clear(k); // 清除此位置上的位为0
k += i;
}
}
++i;
}
while (i <= n) {
if (b.get(i)) {
primes.add(i);
}
++i;
}
System.out.println(primes);
}
}