当前位置:   article > 正文

C++ 素数(质数)的判定方法_c++质数是数论的宠儿,也称作素数,一个数是质数,意味着它只能被1和它本身整除。比

c++质数是数论的宠儿,也称作素数,一个数是质数,意味着它只能被1和它本身整除。比

 

 

素数的介绍:

素数定义:质数(prime number)又称素数,有无限个。一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说,就是该数除了1和它本身以外不再有其他的因数;否则称为合数。根据算术基本定理,每一个,比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑这些质数在乘积中的顺序,那么写出来的形式是唯一的。最小的质数是2.

方法一:暴力筛选法

思路:根据素数的定义,我们能想到:若要判断n是否是素数,我们可以通过循环for(i=2;i<=n-1;i++)来进行n%i的运算,最后借n能否被i整除,来判断n是否为素数;若n能被整除,则n是素代码实现:

  1. #include<iostream>
  2. using namespace std;
  3. bool is_prime(int n)
  4. {
  5. int i;
  6. for(i=2;i<=n-1;i++)
  7. {
  8. if(n%i==0)
  9. {
  10. return false;//若n能被i整除,则返回false;
  11. break;
  12. }
  13. }
  14. return true;//否则,返回true;
  15. }
  16. int main()
  17. {
  18. int n;
  19. cin>>n;
  20. is_prime(n);
  21. if(is_prime(true))
  22. {cout<<"Yes"<<endl;}
  23. else cout<<"No"<<endl;
  24. return 0;
  25. }

 在暴力筛选法中,我们可以发现其为时间复杂度O(n),在此基础上,我们还可以优化将其变为时间复杂度O(sqrt(n)) .

优化原理:素数是因子为1和本身,若n不是素数,则一定是合数(一个合数一定含有小于它平方根的质因子)。假如该非素数为n=a*b,那么a,b一定有一个大于sqrt(n),一个小于sqrt(n)。所以必有一个小于或等于其平方根的因数,因此,验证n是否为素数时就只需要验证到n的平方根即可

(不使用算术平方根)代码实现:

  1. #include<iostream>
  2. using namespace std;
  3. bool is_prime(int n)
  4. {
  5. int i;
  6. if(n<2)return false;
  7. for(i=2;i*i<=n;i++) //这里可以不必单独使用平方算术根来表示
  8. {
  9. if(n%i==0)
  10. {
  11. return false;
  12. break;
  13. }
  14. }
  15. return true;
  16. }
  17. int main()
  18. {
  19. int n;
  20. cin>>n;
  21. is_prime(n);
  22. if(is_prime(true))
  23. {
  24. cout<<"Yes"<<endl;
  25. }
  26. else cout<<"No"<<endl;
  27. return 0;
  28. }

 (使用算术平方根)代码实现:

  1. #include<iostream>
  2. #include<cmath>
  3. using namespace std;
  4. bool is_prime(int n)
  5. {
  6. int i;
  7. if(n<2)return false;
  8. for(i=2;i<=sqrt(n);i++)
  9. {
  10. if(n%i==0)
  11. {
  12. return false;
  13. break;
  14. }
  15. }
  16. return true;
  17. }
  18. int main()
  19. {
  20. int n;
  21. cin>>n;
  22. is_prime(n);
  23. if(is_prime(true))
  24. {
  25. cout<<"Yes"<<endl;
  26. }
  27. else cout<<"No"<<endl;
  28. return 0;
  29. }

方法二:count(有且仅有两因子:1和本身)

思路;根据素数的定义得出结论:构成素数的因子只有两个,即1和它本身,则通过count number(因子数)可以来筛选素数。

代码实现:一般型

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. int i,n,count=0;
  6. cin>>n;
  7. for(i=1;i<=n;i++)
  8. {
  9. if(n%i==0)//筛选出因子只有1和它本身的数
  10. count++;
  11. }
  12. if(count==2)
  13. {
  14. cout<<"Yes"<<endl;
  15. }
  16. else cout<<"No"<<endl;
  17. return 0;
  18. }

函数型:

  1. #include<iostream>
  2. using namespace std;
  3. bool is_prime(int n)
  4. {
  5. int i,count=0;
  6. for(i=1;i<=n;i++)
  7. {
  8. if(n%i==0)
  9. {count++;}
  10. }
  11. if(count==2) return true;
  12. else return false;
  13. }
  14. int main()
  15. {
  16. int n;
  17. cin>>n;
  18. is_prime(n);
  19. if(is_prime(n))
  20. {
  21. cout<<"Yes"<<endl;
  22. }
  23. else cout<<"No"<<endl;
  24. return 0;
  25. }

 方法三:素数表筛选法

素数表筛选法顾名思义就是将素数存储到一个表中,然后对需要判断的数在该表中查找,能找到的即为素数,否则不是素数。

思路:(查找原理)若一个数不能整除比它小的任何素数,那么这个数就是素数。缺点:效率低下

代码实现:

  1. /*n:所要判断的数;
  2. j:素数表中素数的数;
  3. */
  4. #include<iostream>
  5. using namespace std;
  6. bool is_prime(int n)
  7. {
  8. int i,j;
  9. for(i=0;i<j;i++)
  10. {
  11. if(n%primearray[i]==0)
  12. {
  13. return false;
  14. break;
  15. }
  16. return true;
  17. }
  18. }

 

 

 

 

 

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

闽ICP备14008679号