参考链接:https://cloud.tencent.com/developer/article/2054290
朴素素数:
bool rule(int n){ for(int i=2;i*i<=n;i++) if(n%i==0) return false; return true; }
埃氏筛法 :
从2开始,将每个质数的倍数都标记成合数(限制条件为倍数小于n),以达到筛选素数的目的。
const int N=1e8; int vis[N]; void prime(int n){ vis[0]=vis[1]=1; for(int i=2;i<=n;i++){ if(!vis[i]){ for(int j=i*i;j<=n;j+=i)//n是素数,所以n*n,n*(n+1)不是素数 vis[j]=1; } } }//当vis[i]==0的时候表示i为素数
埃氏筛法的缺陷 :对于一个合数,有可能被筛多次。例如 30 = 2 * 15 = 3 * 10 = 5*6……如何确保每个合数只被筛选一次,我们用它的最小质因子来筛选,便是欧拉筛法。
此刻引入欧拉筛
欧拉筛:
让每个合数只被它的最小质因子筛选一次,以达到不重复的目的
const int N=1e8; int vis[N],prime[N];//vis的素数标记数组,prime保存素数 void Prime(int n){ for(int i=2;i<=n;i++){ if(!vis[i]) prime[++prime[0]]=i;//prime[0]为素数个数 for(int j=1;j<=prime[0]&&i*prime[j]<=n;j++){//遍历已经保存素数中 vis[i*prime[j]]=1; if(i%prime[j]==0)break;//优化
//i = 8 ,j = 1,prime[j] = 2,如果不跳出循环,prime[j+1] = 3,8 * 3 = 2 * 4 * 3 = 2 * 12,在i = 12时会计算。因为欧拉筛法的原理便是通过最小素因子来消除。
} } }
标签:prime,筛法,int,合数,vis,素数 From: https://www.cnblogs.com/jerrytangcaicai/p/16913277.html