当前位置:   article > 正文

素数的高效算法_产生大素数最高效的算法的复杂度

产生大素数最高效的算法的复杂度

素数最简单的判断方法是采用枚举,复杂度为O(n)。(这里不作解释)

这里将介绍下列几点:
1)素数判断,复杂度为O(√n)的原理及代码。
2)素数表的获取。
3)更为高效判断素数的"筛选法"。

(一)素数判断
这里介绍复杂度为O(√n)的原理:
例:2~n-1中存在n的约数,不妨设为k,即n%k==0,那么由k*(n/k)==0,n/k也是n的一个约数,因此得到了k与n/k中一定满足:一个数小于√n,一个数大于√n。
这里稍作解释:√n*√n=n,而k*n/k=n,因此一个约数小于√n,一个约数大于√n。
启示:只需判断n能否被2,3...,|_√n_|中的一个整除即可(其中|_√n_|表示向下取整)。

在此注意sqrt()函数的用法:
1)传入的参数应为浮点型。
2)返回的类型也为浮点型。

因此:请严格按照标准来书写代码。

  1. bool isPrime(int n){
  2. if(n<=1) return false;
  3. int sqr=(int)sqrt(1.0*n);
  4. for(int i=2;i<=sqr;i++){
  5. if(n%i==0) return false;
  6. }
  7. return true;
  8. }

可能你还有看到其他更为简单的写法如:

  1. bool isPrime(int n){
  2. if(n<=1) return false;
  3. for(int i=2;i*i<=n;i++){
  4. if(n%i==0) return false;
  5. }
  6. return true;
  7. }

建议新手不要使用此简单的写法,原因:在n接近int类型范围上界时,i*i极有可能越界溢出。(当然n在10^9以内是绝对安全的)
不过这也是有解决办法的:将i定义为long long类型即可。

 

(二)获取表
方法:从1~n枚举,判断每个数是否为素数。
时间复杂度:一部分O(n),另一部分O(n√n),因此获取表的复杂度为O(n*n√n)。

  1. #include <stdio.h>
  2. #include <math.h>
  3. //求100以内素数表
  4. bool isPrime(int );
  5. int prime[101],Num=0;
  6. void Find_Prime(){
  7. for(int i=1;i<101;i++){
  8. if(isPrime(i)==true){
  9. prime[Num++]=i;
  10. }
  11. }
  12. }
  13. //判断n是否为素数
  14. bool isPrime(int n){
  15. if(n<=1) return false;
  16. int sqr=(int)sqrt(1.0*n);
  17. for(int i=2;i<=sqr;i++){
  18. if(n%i==0) return false;
  19. }
  20. return true;
  21. }
  22. int main(){
  23. Find_Prime();
  24. for(int i=0;i<Num;i++) {
  25. printf("%d ",prime[i]);
  26. }
  27. return 0;
  28. }

 

(三)筛选法求素数
原理:把2到n中所有的数都列出来,然后从2开始,先划掉n内所有2的倍数,然后每次从下一个剩下的数(必然是素数)开始,划掉其n内的所有倍数。最后剩下的数,就都是素数。

具体过程:自己百度。

  1. int prime[101],Num=0;
  2. bool p[101]={0};//如何为素数则为false
  3. void Find_Prime(){
  4. for(int i=2;i<101;i++){
  5. if(p[i]==false){
  6. prime[Num++]=i;
  7. for(int j=i+i;j<101;j=j+i){
  8. p[j]=true;
  9. }
  10. }
  11. }
  12. }

时间复杂度为O(nloglogn)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/75217
推荐阅读
相关标签
  

闽ICP备14008679号