素数筛法详解:欧拉筛素数

当数据量很大时,我们不能一个一个去判断每个数是否为素数,那么我们可以采用欧拉筛来做

由于埃氏筛会存在某个合数多次被筛的情况,所以

欧拉筛的核心思想就是:让每个合数只被它的的最小质因子筛选一次,没有重复

欧拉筛:时间复杂度为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 } 
原文地址:https://www.cnblogs.com/nilbook/p/13775230.html