埃氏筛+欧拉筛 (c++)

求出从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;
}
}

posted on   可爱楷玩算法  阅读(53)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示