埃氏筛+欧拉筛 (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 2024-06-17 21:02  可爱楷玩算法  阅读(212)  评论(0)    收藏  举报

导航