当前位置:   article > 正文

c/c++ 判断素数的方法(三个)_c++判断素数

c++判断素数

1.常规的函数判断法

 

假如题目是我们要求 1~n之间的素数并打印出来,我们可以写如下函数:

  1. int prime(int i) // 求是否为素数需要考虑1,2两种情况
  2. {
  3. if (i == 1) return 0;
  4. if (i == 2) return 1;
  5. for (int j = 2; j * j <= i; ++j)
  6. if (i % j == 0)//如果遇到j是i的因数,i就不是质数,返回0
  7. return 0;
  8. return 1;//没有找到这个数的因数就返回1
  9. }
  10. int main()
  11. {
  12. int n;
  13. scanf("%d", &n);
  14. for (int i = 1; i <= n; ++i)
  15. if (prime(i))
  16. printf("%d ", i);
  17. return 0;
  18. }

2.埃氏筛法

我们在幼儿园就学过合数是除了能被1和它本身整除,还能被其他的正整数整除的数,然而合数还有如下定义:当一个数可以被素数之乘积表示时,它被称为合数。这是基本定理算术,也被称为唯一素因数分解定理。这个定理表明任何一个大于1的整数都可以被唯一地分解成素数的乘积。

 埃氏筛核心思想就是 从第一个没有被筛除过数(num)的开始,在给定的范围内依次筛去num的倍数,例如,num=2,我们可以依次筛去4,6,8......;对于,num=n,依次筛除 k*n(k=1,2,3...);

代码实现:

  1. int pri[10000001];
  2. int main()
  3. {
  4. int n;
  5. scanf("%d",&n);
  6. for(int i = 2; i*i <= n; i++)//埃氏筛 时间复杂度接近于线性(n*lnln(n))
  7. {
  8. if(pri[i] == 0)
  9. {
  10. for(int j = i * i; j <= n; j += i)
  11. pri[j] = 1; // j是i的一个倍数,则j是合数,筛掉。
  12. }
  13. }

3.欧拉筛

这是对埃氏筛的优化,埃氏筛法在执行时可能会对同一个数进行多次筛除

比如num=120  会在i=(2,3,4,6......)的时候分别筛除一次,而且数越大会被筛除的次数越多,就造成了很大的时间浪费

而欧拉筛的核心思想就是确保每个合数只被最小质因数筛掉。

代码实现:

  1. int vis[10000001];
  2. int pri[10000001];
  3. int main()
  4. {
  5. int n=10000,m=0,cnt=0;
  6. for (int i = 2; i <= n; i ++ )//欧拉筛 时间复杂度基本为O(n)
  7. {
  8. if (vis[i] == 0) pri[cnt ++ ] = i;//将质数存到pri中
  9. for (int j = 0; pri[j] * i <= n; j ++ )//要确保当前质数的i倍小于等于n。
  10. {
  11. vis[pri[j] * i] = 1;
  12. if (i % pri[j] == 0) break;//终止条件(当前数i遇到了它的最小质因数)
  13. }
  14. }
  15. return 0;
  16. }

 

 

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

闽ICP备14008679号