本文主要介绍的是“埃氏筛法”。
素数筛法的关键在于一个“筛”字。其基本思路是,从2开始,对所有的素数,筛去它所有的倍数。我们唯一需要知道的是2是一个素数。
设置一个整型数组prime[],用来装对应的素数,一个布尔型数组p[],判断每一个数是否为素数,是的话就是false,不是的话值为true。设置一个pNum统计素数的个数。
从2开始,因为2是素数,所以把2装进prime,并将2的倍数,4,6,8,10…所对应的p[2],p[4],p[8],p[10]…的布尔值全部改为true。pNum的值加1。
接下来是3,p[3]此时的值依然是false,则把3装进prime,并将3的倍数,6,9,12…对应的p[6],p[9],p[12]…的布尔值改为true。pNum的值加1。
接下来是4,p[4]此时的值是true,说明它不是素数。
接下来是5,p[5]此时的值是false,说明它是素数,则将5的倍数,10,15,20…对应的p[10],p[15],p[20]…的值改为true,pNum的值加1。
…
接下来的过程也是类似的。从小到大遍历到某数a的时候,若p[a]还是false,表示a并没有被筛去,也就是说小于a的数中没有a的因子,所以a就一定是一个素数。
最后附上本文的Java代码。
public class FindPrime {
final int maxn = 10000001;
int[] prime = new int[maxn];
int pNum = 0;
boolean[] judge = new boolean[maxn];
public void init(){
for(int i = 0;i < maxn;i++)
judge[i] = false;
}
public void findPrime(){
for(int i = 2;i < maxn;i++){
if(judge[i] == false){
pNum++;
for(int j = i + i;j < maxn;j += i){
judge[j] = true;
}
}
}
}
public static void main(String[] args){
//System.out.println(Integer.MAX_VALUE);
FindPrime findPrime = new FindPrime();
findPrime.findPrime();
System.out.println(findPrime.pNum);
}
}
总个数应为664579个。