当前位置:   article > 正文

C语言——判断一个数是不是素数 && 给定整数m和n区间内素数的个数并对它们求和 && 输出n以内的素数_通过子函数判断一个数是不是素数

通过子函数判断一个数是不是素数

素数,指的是大于1的整数中,只能被1和这个数本身整除的数 

注意:1不是素数

一.判断一个数是不是素数

方法一:一般方法

假设这个数是n,我们就拿这个数和从2到n-1的每个数去和这个数做取余操作,如果有一个数可以使得余数为0,则这个数不是素数,反之则这个数为素数。

  1. //判断一个数是不是素数
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int a;
  6. printf("请输入一个数:\n");
  7. scanf("%d", &a);
  8. int t=1;
  9. for (int i = 2; i < a; i++)
  10. {
  11. if (a % i == 0)
  12. {
  13. t = 0;
  14. break;
  15. }
  16. }
  17. if (t == 0)
  18. {
  19. printf("%d 不是素数!\n", a);
  20. }
  21. else
  22. {
  23. printf("%d是素数!\n", a);
  24. }
  25. return 0;
  26. }

方法二: 不超过本身的1/2

每个数的因数中,其中一个不会超过本身的1/2;

比如:因为1*12=12  2*6=12  3*4=12  所以12的因数有1和12,2和6,3和4,每组因数中都有一个不会超过12这个数的1/2;

这样我们就可以对方法一优化一下

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int a;
  5. printf("请输入一个数:\n");
  6. scanf("%d", &a);
  7. int t=1;
  8. for (int i = 2; i < a/2; i++)
  9. {
  10. if (a % i == 0)
  11. {
  12. t = 0;
  13. break;
  14. }
  15. }
  16. if (t == 0)
  17. {
  18. printf("%d 不是素数!\n", a);
  19. }
  20. else
  21. {
  22. printf("%d是素数!\n", a);
  23. }
  24. return 0;
  25. }

方法三:不超过本身的开方

每个数的因数中,其中一个不会超过本身的开方;

比如:因为1*16=16  2*8=16 4*4=16  所以16的因数有1和16,2和8,4和4,每组因数中都有一个不会超过16这个数的开方;

这样我们就可以对方法二优化一下

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int a;
  6. printf("请输入一个数:\n");
  7. scanf("%d", &a);
  8. int t = 1;
  9. for (int i = 2; i <= sqrt(a); i++) //sqrt()是开方的意思,这个函数在math.h文件里
  10. {
  11. if (a % i == 0)
  12. {
  13. t = 0;
  14. break;
  15. }
  16. }
  17. if (t == 0)
  18. {
  19. printf("%d 不是素数!\n", a);
  20. }
  21. else
  22. {
  23. printf("%d是素数!\n", a);
  24. }
  25. return 0;
  26. }

  二.给定整数m和n区间内素数的个数并对它们求和.

方法一:一般方法

  1. // 本题要求统计给定整数M和N区间内素数的个数并对它们求和.
  2. //1不是素数,单独考虑1
  3. #include <stdio.h>
  4. int main()
  5. {
  6. int m, n, flag = 0, sum = 0, t = 0;
  7. printf("请输入M和N的值(1<=m<=n<=500):\n");
  8. scanf("%d%d", &m, &n);
  9. for (int i = m; i <= n; i++)
  10. {
  11. if(i==1)
  12. i = 2;
  13. for (int j = 2; j < i; j++)
  14. {
  15. if (i % j == 0)
  16. {
  17. flag = 1;//不是素数,flag=1
  18. break;
  19. }
  20. }
  21. if (flag == 0) //flag==o,是素数的情况
  22. {
  23. t++;
  24. sum += i;
  25. // printf("%d为素数\n", i);//这句话可以用来输出素数
  26. }
  27. else //flag==0,不是素数的情况
  28. flag = 0;
  29. }
  30. printf("%d与%d之间有%d个素数\n", m, n, t);
  31. printf("它们的和为%d\n", sum);
  32. }

 三.输出n以内的素数

方法一:一般方法

在判断一个数是不是素数的基础上加一个循环

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int number, isPrime = 1, x;
  6. printf("请输入一个数:\n");
  7. scanf("%d", &number);
  8. printf("%d里的素数有:", number);
  9. for (int y = 1; y <= number; y++)
  10. {
  11. for (int i = 2; i < sqrt(y); i++) // 判断y是不是素数//如果y不是素数,则isPrime = 0;
  12. {
  13. if (y % i == 0)
  14. {
  15. isPrime = 0;
  16. break;
  17. }
  18. }
  19. if (isPrime != 0)
  20. {
  21. printf("%d ", y);
  22. }
  23. else
  24. {
  25. isPrime = 1;
  26. }
  27. }
  28. return 0;
  29. }

方法二:倍数

1.令x为2

2.将2x、3x、4x直至ax (ax< n)的数标记为非素数

3.令x为下一个没有被标记为非素数的数,重复2

4.直到所有的数都已经尝试完毕

  1. //将n以内所有的数的isPrime值为1(真)——数组
  2. //将所有的2(3,4...)的倍数的数的isPrime值为0(假)——循环
  3. //输出剩下isPrime值为1(真)的数——循环
  4. #include <stdio.h>
  5. int main()
  6. {
  7. int i;
  8. int x;
  9. int maxNumber;
  10. printf("请输入一个数:\n");
  11. scanf("%d", &maxNumber);
  12. int isPrime[maxNumber+1];
  13. for (i = 1; i < maxNumber+1; i++)
  14. {
  15. isPrime[i] = 1; // 让所有的isPrime[i]值为1,即先将所有数标记为素数
  16. }
  17. for (x = 2; x < maxNumber; x++) // 让x从2开始,往后,x为下一个标记为素数的数,(因为for循环只有一个if语句,x如果是标记为非素数(isPrime[x]=0)的数,那么x无法进入if,那便继续x++,直到x为下一个没有标记为非素数的数即可进去if)
  18. {
  19. if (isPrime[x]) // isPrime为真(即为1)的话进入if
  20. {
  21. for (i = 2; i * x < maxNumber+1; i++) // i*x为 2(3,4...)倍的x
  22. {
  23. isPrime[i * x] = 0; // 令x的2(3,4...)倍数的数isPrime值为0
  24. }
  25. }
  26. }
  27. for (i = 2; i <= maxNumber; i++)
  28. {
  29. if (isPrime[i]) // isPrime为真(即为1)的话进入if
  30. {
  31. printf("%d ", i);
  32. }
  33. }
  34. printf("\n");
  35. return 0;
  36. }

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

闽ICP备14008679号