您的位置:首页 > 其它

Eratosthenes筛法和Euler筛法

2015-02-24 20:28 453 查看

Eratosthenes筛法:

先用第一个质数2去筛,2留下,把2的倍数剔除掉;再用下一个素数,也就是3筛,把3留下,把3的倍数剔除掉;接下去用下一个素数5筛,把5留下,把5的倍数剔除掉;不断重复下去……最后剩下来的都是质数。

//判断前N个质数
bool IsPrime
;
int prime[N/2],tot = 0;
memset(IsPrime,true,sizeof(IsPrime));
for (int i = 2;i <= N;i++)
if (IsPrime[i]){
prime[tot++] = i;
for (int j = i*2;j <= N;j += i)
IsPrime[j] = false;
}


时间复杂度:O(NloglogN)

Euler筛法

bool IsPrime
;
int prime[N/2],tot = 0;
memset(IsPrime,true,sizeof(IsPrime));
for (int i = 2;i <= N;i++){
if (IsPrime[i])
prime[tot++] = i;
for (int j = 0;j < tot;j++){
if (i*prime[j] > N)//超过最大范围,跳出
break;
IsPrime[i*prime[j]] = false;//将倍数筛除
if (i%prime[j] == 0)//保证只筛到以prime[j]为最小质因数的数
break;
}
}


时间复杂度:O(N)

文章来源
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: