素数筛选 O(n)算法

num = 0;
memset(data, 0, sizeof(data));
data[1] = 1;
for(i=2; i<N; i++)
{
       //data[i]为1表示i不是素数,为0表示i是素数
        if( !data[i] )
            prime[num++] = i;
       //素数筛选
        for(j=0;  j<num&&i*prime[j]<N; j++)
       {
             data[i*prime[j]] = 1;
             /*
             i整除prime[j]便可退出,因为 i*prime[j+k](k>0) 一定会在后面被标记到
           证明:
              令i = prime[j]*x (整除)
              i*prime[j+k]  =  prime[j]*x * prime[j+k] = prime[j] * (x*prime[j+k])
              显然x*prime[j+k] > prime[j]*x = i  而 prime[j]为素数
              当i增大到 x*prime[j+k] 便会标记到 prime[j] * (x*prime[j+k]) = i*prime[j+k]
              所以  i*prime[j+k] 一定会在后面被标记到
              */
              if( i%prime[j]  == 0 )
                   break;
        }
}

/*
在素数筛选中,合数只被标记一次,故里面总的循环次数接近N,加上外循环N次,时间复杂度为O(2n)即O(n)
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值