從2開始,刪除所有2的倍數(shù)的數(shù)。
然后是3,5,7,...
下一次循環(huán)進(jìn)行時(shí)的第一個(gè)數(shù)一定是素?cái)?shù)。
只進(jìn)行sqrt(n)次循環(huán),因?yàn)橐粋€(gè)數(shù)的約數(shù)只在sqrt(n)這個(gè)范圍內(nèi)。
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); // 設(shè)置此位置上的位為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);
}
}