求出从2到n的素数
埃氏筛
- 方法:筛2的倍数,3的倍数,4的倍数......
- 时间复杂度:O(n·loglogn)
- 缺点:一个数筛了多次,比如6会被2筛,被3筛,被6筛,浪费时间
- 下面的代码中,f是是否是素数的标记数组,N是要筛的个数
f[1]=1;
for (int i=2; i*i<=N; i++)
if (f[i]==0){
for (int j=i+i; j<=N; j+=i)
f[j]=1;
}
欧拉筛(线性筛)
- 方法:每个数只被它最小的素因子筛一次
- 时间复杂度:O(n)
- 下面的代码中,ISP是是否为素数标记,p为存放素数的数组,p_c为当前素数个数,n为要筛的数的个数(第1行使用memset要写
#include<cstring>
或#include<string.h>
memset(isp,true,sizeof isp);
isp[1]=false;
for(int i=2;i<=n;i++){
if(isp[i])
p[++p_c]=i;
for(int j=1;j<=p_c && i*p[j]<=n;j++){
isp[i*p[j]]=false;
if(i%p[j]==0)
break;
}
}
标签:埃氏,isp,个数,c++,素数,倍数,欧拉
From: https://www.cnblogs.com/algorithm-hu/p/18253206