当前位置:   article > 正文

C语言六种方法求素数(质数) 最全 输出2-100以内的所有素数 求1000以内的所有素数_求素数c语言

求素数c语言

方法一:挨个遍历 从1-1000都试一次 -----通俗易懂的方法

  1. #include<stdio.h>
  2. #include<time.h>
  3. bool IsPrime(int n)
  4. {
  5. int i;
  6. if (n <= 1)
  7. {
  8. return false;
  9. }
  10. if (n == 2)
  11. {
  12. return true;
  13. }
  14. for (i = 2; i < n; i++)
  15. {
  16. if (n % i == 0) return false;
  17. }
  18. return true;
  19. }
  20. int main()
  21. {
  22. int n, i;
  23. int t1 = clock();
  24. for (i = 0; i <= 1000; i++)
  25. {
  26. if (IsPrime(i)) printf(" %d ", i);
  27. }
  28. int t2 = clock();
  29. printf("\n运行时间:%d\n", t2 - t1);
  30. return 0;
  31. }

代码运行结果如下:

 

方法二:使用奇数的思想

核心思想:除了2以外那些2的倍数(4、6、8、10、12、14、18·······)都不是质数

代码示例如下:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int x = 0;
  5. int i = 0;
  6. unsigned int count = 0;
  7. x = 2;
  8. printf("%d ", x);
  9. for (x = 3; x < 1000; x += 2)
  10. {
  11. for (i = 2; i < x; i++)
  12. {
  13. count++;
  14. if (x % i == 0)
  15. {
  16. break;
  17. }
  18. }
  19. if (x == i)
  20. {
  21. printf("%d ", x);
  22. }
  23. }
  24. printf("\n\n\n");
  25. printf("运算的次数:%d ", count);
  26. return 0;
  27. }

运行结果如下:

 

方法三:同时使用奇数和偶数来实现

核心思想:所以除了2以外质数一定是奇数

代码示例如下:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int x = 0;
  5. int i = 0;
  6. unsigned int count = 0;
  7. x = 2;
  8. printf("%d ", x);
  9. for (x = 3; x < 1000; x += 2) //两层for循环均只产生奇数
  10. {
  11. for (i = 3; i < x; i += 2) //控制第二层for循环不再自增1,而是从3开始自增2
  12. {
  13. count++;
  14. if (x % i == 0)
  15. {
  16. break;
  17. }
  18. }
  19. if (x == i)
  20. {
  21. printf("%d ", x);
  22. }
  23. }
  24. printf("\n\n\n");
  25. printf("运算的次数:%d ", count);
  26. return 0;
  27. }

代码运行结果如下:

 

方法四:平方根sqrt方法实现

代码示例如下:

  1. #include<stdio.h>
  2. #include<time.h>
  3. #include<math.h>
  4. int IsPrime(int n)
  5. {
  6. int i;
  7. if (n % 2 == 0) return 0;
  8. for (i = 3; i <= sqrt(n); i += 2)
  9. {
  10. if (n % i == 0) return 0;
  11. }
  12. return 1;
  13. }
  14. int main() {
  15. int n, i;
  16. int t1 = clock();
  17. printf(" 2 ");
  18. for (i = 3; i <= 1000; i++)
  19. {
  20. if (IsPrime(i)) printf(" %d ", i);
  21. }
  22. int t2 = clock();
  23. printf("\n运行时间:%d\n", t2 - t1);
  24. }

代码运行结果如下:

 

方法五:使用数组的方法实现

代码示例如下:

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int arr[500] = { 0 };
  5. int x = 0;
  6. int i = 0;
  7. unsigned int count = 0;
  8. int sum = 0; //定义数组的下标
  9. arr[sum] = 2; //把2存到数组中
  10. sum++;
  11. arr[sum] = 3; //把3存到数组中
  12. sum++;
  13. for (x = 5; x < 1000; x += 2)
  14. {
  15. for (i = 0; i < sum; i++)//从下标0开始遍历,直到数组的最后一个质数
  16. {
  17. count++;
  18. if (x % arr[i] == 0)
  19. {
  20. break;
  21. }
  22. }
  23. if (sum == i) //遍历后都不能整除
  24. {
  25. arr[sum] = x; //把质数保存到数组中
  26. sum++; //下标加1,为下次放做准备
  27. }
  28. }
  29. for (i = 0; i < sum; i++)//使用for循环进行输出
  30. {
  31. printf("%d ", arr[i]);
  32. }
  33. printf("\n\n\n");
  34. printf("运算的次数:%d ", count);
  35. return 0;
  36. }

代码运行结果如下:

 

方法六:筛选法(空间换时间)

思路:把2到n中的所有数都列出来,然后从2开始,先筛去n内所有2的倍数,然后每次从下一个剩下的数(必然为质数)开始,筛去其n内所有的倍数,最后剩下的数都是质数

代码示例如下:

  1. //1.设置一个数组a[],a[i]的值为1表示i为质数,将所有元素初始化为1
  2. //2.筛去m的倍数,即把a[2*m]、a[3*m]…置为0
  3. //3.输出a[i]值为1的i。
  4. #include<stdio.h>
  5. #define MAX 1000
  6. int s;
  7. int a[MAX];
  8. void prime()
  9. {
  10. s = 1;
  11. for (int i = 0; i <= MAX; i++)
  12. a[i] = 1;
  13. a[0] = a[1] = 0;
  14. for (int i = 2; i <= MAX; i++)
  15. {
  16. if (a[i])
  17. a[s++] = i;
  18. for (int j = i * 2; j <= MAX; j += i)
  19. a[j] = 0;
  20. }
  21. }
  22. int main()
  23. {
  24. prime();
  25. for (int i = 1; i < s; i++)
  26. printf("%d ", a[i]);
  27. return 0;
  28. }

代码运行结果如下:

 

编者注:以上对本小题的代码编写的多种方法,欢迎大家收藏借鉴并转发;

               以上代码仅供参考,如有问题欢迎大家在留言区批评指正;

               版权所有,翻印必究,如有雷同纯属巧合,转载请注明出处。

               By CRH380AJ2808 2022.04.27


————————————————
版权声明:本文为CSDN博主「CRH380AJ2808」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/JH13thpig/article/details/124440215

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

闽ICP备14008679号