您的位置:首页 > 其它

线性筛法求素数

2012-09-27 08:22 204 查看
这个是经典的Eraosthenes筛法:

for (int i = 2; i * i < N; i++)
{
if (tag[i]) continue;
for (int j = i; j * j < N; j++)
tag[i*j] = 1;
}
for (int i = 2; i < N; i++)
if (!tag[i])
prime[tol++] = i;


但是Eraosthenes筛法的速度并不快,原因在于对于一个合数,这种方法会重复的标记。一种线性筛素数的方法有效的解决了这一点,代码如下:

void get_prime()
{
int cnt = 0;
for (int i = 2; i < N; i++)
{
if (!tag[i])    p[cnt++] = i;
for (int j = 0; j < cnt && p[j] * i < N; j++)
{
tag[i*p[j]] = 1;
if (i % p[j] == 0)
break;
}
}
}


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