当前位置:   article > 正文

运用C++查找素数_找素数c++程序编写

找素数c++程序编写

查找素数是在学习C/C++中基本的问题,主要是考察对循环的应用,逻辑上并不是很难。

对于常规的素数查找法,解题步骤通常是:(以查找100以内的素数为例)

1.从2开始逐步循环;

2.再进行嵌套循环,判断2能否被2之后的数字整除;

3.如果恰好有能被整除的则结束循环;如果没有则输出素数;

4.一直重复上面的步骤,就能找出100以内的全部素数。

代码如下

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int i,j,k,MAX;
  6. cout<<"请输入你要查找多少以内的素数?"<<endl;
  7. cin>>MAX;
  8. for(i=2;i<=MAX;i++)
  9. {
  10. for(j=2;j<i;j++)
  11. if(i%j==0)
  12. break;
  13. if(j==i)
  14. {
  15. cout<<i<<" ";
  16. }
  17. }
  18. cout<<endl;
  19. return 0;
  20. }

运行结果为:

 

这个代码足够解决这个问题,但是缺陷就是速度太慢,时间复杂度达到O(n^2)!!!

仅仅是求100以内的素数就花了2ms;求100000以内的素数花了2218ms!

所以我们进一步改善求解的思路。

我们知道如果一个数不被它以内的素数整除,就代表它是素数!有了这个思想,我们设计出了进阶算法,来求素数。

代码如下:

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. // 定义一个数组存放素数
  6. int MAX,n=1,j;
  7. cout<<"请输入你要查找多少以内的素数?"<<endl;
  8. cin>>MAX;
  9. int list[MAX];
  10. // 查找MAX以内的素数存放到数组中
  11. list[0]=2;
  12. for(int k=3;k<=MAX;k++)
  13. {
  14. for(j=0;j<n;j++)
  15. {
  16. if(k%list[j]==0)
  17. break;
  18. }
  19. if(j==n)
  20. {
  21. list[n]=k;
  22. n++;
  23. }
  24. }
  25. for(int i=0;i<n;i++)
  26. cout<<list[i]<<" ";
  27. cout<<endl;
  28. cout<<"在"<<MAX<<"以内一共有"<<n<<"个素数!"<<endl;
  29. return 0;
  30. }

运行结果为:

 改良后的代码所花时间更好,在求100以内的素数时花费0ms,在求10000以内的素数时仅花费2ms!下面我们进行一下比较。

在两个代码上都加上可以求运算时间的函数,代码如下:

  1. // 常规求法
  2. #include<iostream>
  3. #include<ctime>
  4. using namespace std;
  5. int main()
  6. {
  7. // 计算运行的时间
  8. int begintime,endtime;
  9. int i,j,k,MAX;
  10. cout<<"请输入你要查找多少以内的素数?"<<endl;
  11. cin>>MAX;
  12. int n=0;
  13. begintime=clock(); //计时开始
  14. for(i=2;i<=MAX;i++)
  15. {
  16. for(j=2;j<i;j++)
  17. if(i%j==0)
  18. break;
  19. if(j==i)
  20. {
  21. cout<<i<<" ";
  22. n++;
  23. }
  24. }
  25. endtime = clock(); //计时结束
  26. cout<<endl;
  27. cout<<"在"<<MAX<<"以内一共有"<<n<<"个素数!"<<endl;
  28. cout<<"花费时间为:"<<endtime-begintime<<"ms"<<endl;
  29. return 0;
  30. }
  1. // 改善算法代码
  2. #include<iostream>
  3. #include<ctime>
  4. using namespace std;
  5. int main()
  6. {
  7. // 计算运行的时间
  8. int begintime,endtime;
  9. // 定义一个数组存放素数
  10. int MAX,n=1,j;
  11. cout<<"请输入你要查找多少以内的素数?"<<endl;
  12. cin>>MAX;
  13. int list[MAX];
  14. // 查找MAX以内的素数存放到数组中
  15. list[0]=2;
  16. begintime=clock(); //计时开始
  17. for(int k=3;k<=MAX;k++)
  18. {
  19. for(j=0;j<n;j++)
  20. {
  21. if(k%list[j]==0)
  22. break;
  23. }
  24. if(j==n)
  25. {
  26. list[n]=k;
  27. n++;
  28. }
  29. }
  30. endtime = clock(); //计时结束
  31. for(int i=0;i<n;i++)
  32. cout<<list[i]<<" ";
  33. cout<<endl;
  34. cout<<"在"<<MAX<<"以内一共有"<<n<<"个素数!"<<endl;
  35. cout<<"花费时间为:"<<endtime-begintime<<"ms"<<endl;
  36. return 0;
  37. }

分别求100000以内的素数,我们可以得到结果分别为:

 

 两者对比一目了然,修改之后的代码是原来的19.6倍!!!

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

闽ICP备14008679号