一千万以内的素数
作者:互联网
本文主要介绍的是“埃氏筛法”。
素数筛法的关键在于一个“筛”字。其基本思路是,从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个。
标签:pNum,以内,一千万,int,素数,maxn,false,true 来源: https://www.cnblogs.com/maximusyoung/p/10746775.html