关于埃拉托色尼筛选法的整理(质数问题)

Posted 女王公园的八神

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于埃拉托色尼筛选法的整理(质数问题)相关的知识,希望对你有一定的参考价值。

求素数的问题也有不少的算法,埃拉托色尼筛选法应该算是时间复杂度不大的一种算法。。。。

比如要求从1到n范围内的素数表,基本算法思想就是从第一个质数2开始,把2的所有倍数标记为非素数,然后进入到3,把3的所有倍数标记为非素数,然后跳过4(因为4是2的倍数而且已经被标记为非素数了),然后进入到5,把5的所有倍数标记为非素数,循环直至结束。

    以上算法还可以继续改进,那就是最外层循环可以只遍历到根号n就行了。因为大于根号n的数要么是素数,要么就有一个小于根号n的因数(而这是不可能发生的,因为如果它有小于根号n的因数的话,那他就已经被筛掉了)。

    代码如下所示:

 1 #include<iostream>
 2 #include<cstdio>
 3 #define N 10000
 4 using namespace std;
 5 int main()//从2开始往后看,凡是2,3,5的倍数全部筛掉
 6 {
 7     int i,j,k,a[N];
 8     for(i=2;i<N;i++)
 9         a[i]=1;
10     for(i=2;i<N;i++)
11     {
12         if(a[i])
13             for(j=i;i*j<N;j++)
14             {
15                 k=i*j;
16                 a[k]=0;
17             }
18     }
19     for(i=2;i<N;i++)
20         if(a[i])
21             printf("%d ",i);
22     return 0;
23 }

 

以上是关于关于埃拉托色尼筛选法的整理(质数问题)的主要内容,如果未能解决你的问题,请参考以下文章

埃拉托色尼筛选法的步骤

埃拉托色尼筛选法的C++实现

这是用埃拉托色尼筛选法筛选2~1000的素数的C++程序,能否详细解释一下每个步骤的意思

埃拉托色尼筛选法

埃拉托色尼质数筛法

埃拉托色尼筛法及线性筛法