求一千万以内的所有素数的个数

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值