一千万以内的素数

本文主要介绍的是“埃氏筛法”。

素数筛法的关键在于一个“筛”字。其基本思路是,从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个。

猜你喜欢

转载自www.cnblogs.com/maximusyoung/p/10746775.html