当数据量很大时,我们不能一个一个去判断每个数是否为素数,那么我们可以采用欧拉筛来做
由于埃氏筛会存在某个合数多次被筛的情况,所以
欧拉筛的核心思想就是:让每个合数只被它的的最小质因子筛选一次,没有重复
欧拉筛:时间复杂度为O(n),所以也称为线性筛,但只能筛到1e8这么大
1 const int maxn=100000005; 2 int prime[maxn];//素数表 3 bool sf[maxn];//判断是不是素数 4 //欧拉筛素数: 5 void sushu(int n){ 6 int cnt=0; 7 memset(sf,true,sizeof(sf));//开始全设为是素数 8 for(int i=2;i<=maxn;i++){//外层枚举所有数 9 if(sf[i]) prime[++cnt]=i;//是质数加入质数表 10 for(int j=1;j<=cnt;j++){//内层枚举cnt以内的质数prime[j] 11 if(i*prime[j]>maxn) break;//筛完结束 12 sf[i*prime[j]]==false;//筛掉合数:置合数为false 13 if(i%prime[j]==0) break;//重点:避免重复筛 14 } 15 } 16 sf[0]=false; 17 sf[1]=false; 18 }