素数,不同的质数,各种各样的问题总是遇到的素数。
以下我们来说一下求素数的一种比較有效的算法。
就是筛法。由于这个要求得1-n区间的素数仅仅须要O(nloglogn)的时间复杂度。
以下来说一下它的思路。
思路:如今又1-n的数字。素数嘛就是除了1和本身之外没有其它的约数。所以有约数的都不是素数。
我们从2開始往后遍历,是2的倍数的都不是素数。所以我们把他们划掉
然后如今从2往后就是3了 由于3的前面没有能整除3的,所以3是素数,然后3的倍数全都不是素数。我们接着划掉。
然后就是5了。由于4是2的倍数不是素数(这里可能会问,那4的倍数呢。由于4的倍数必定是2的倍数。所以早就划掉了)。所以我们接着来看5,划掉5的倍数
就这样我们一次类推。求到根号下n(sqrt(n))即可了 。由于为什么到sqrt(n)即可了呢,举个样例吧如果sqrt(n)=7。 如今到7了 7的两倍10 已经被前面的2消去了,7的3倍21已经被3消去了。
。。。
所以到7的时候仅仅有7的7倍还存在。
以下贴上代码:
#include<iostream> using namespace std; int main() { bool b[10000]; memset(b,true,sizeof(b)); for(int i=2;i<10000;i++) { if(b[i]) { for(int j=i+i;j<10000;j+=i) { b[j]=false; } } } for(int i=1;i<10000;i++) { if(b[i]) cout<<i<<" "; } system("pause"); }
代码是任意写的主要理解当中的意思。
好了!
谢谢你坚持。
版权声明:本文博客原创文章,博客,未经同意,不得转载。
时间: 2024-11-01 16:38:31