筛法求素数


the gif is from DEVEN BHOOSHAN-MIRAGE

const int MAX=2000;
int prim[MAX];  //保存素数
int fla[MAX];  //记录是否为素数
int prime(){
    memset(fla,1,sizeof(fla));
    for(int i=2;i<MAX;i++)
        if(fla[i]){  //如果i是素数,那么与它的整数倍的数都不是素数
            for(int j=i*2;j<MAX;j+=i){
                fla[j]=0;
            }
        }
    int k=0;
    for(int i=1;i<MAX;i++){ //保存素数表
        if(fla[i])
            prim[k++]=i;
    }
    return k;
}
//代码中忽略考虑1,1不是素数,最小的素数是2
//prim[MAX]中从prim[1]开始为素数表

补充

代码优化:

int prim[MAX],fla[MAX],cnt=0;
int prime(){
    memset(fla, 1, sizeof(fla));  
    fla[0]=false;    //将0,1排除在素数范围外
    fla[1]=false;       
    for (int i=2;i<MAX;i++)
      if (fla[i]){
        prim[++cnt]=i;       
        for (int k=i*i;k<MAX;k+=i) //由之前的i*2改为i*i
            fla[k]=false;
      }        
    return cnt;
}    

快速线性筛法
之前的方法会造成重复筛除合数,影响效率。比如6,在i=2的时候,k=2*3筛了一次;在i=3,k=3*2 的时候又筛了一次。所以,也就有了快速线性筛法。

int isNotPrime[N] = {1, 1};
int prim[N] = {0},num_prime = 0;
int prime(){
    for(int i = 2 ; i < N ; i ++)
    {
        if(! isNotPrime[i])
            prim[num_prime++]=i;

        for(long j = 0 ; j < num_prime && i * prim[j] <  N ; j ++)
        {
            isNotPrime[i * prim[j]] = 1;
            if( !(i % prim[j] ) )
                break;
        }
    }
    return num_prime;
}

ref:Dinosoft

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值