当前位置:   article > 正文

素数的求解精析!!_c语言j*j<=i和开sqrt(i)有啥区别

c语言j*j<=i和开sqrt(i)有啥区别

素数:只能被1和本身整除的数称为素数。

方法一:试除法

假设要看100是否为素数,只需要将100分别与2~99 的所有数依次相除。

如果2~99其中有数字能够被100整除,则说明100不是素数;

如果2~99中没有数字能够被100整除,则说明100是素数。

即要看i是否为素数,只需要将i分别与2~i-1的所有数一次相除

因此需要用到循环,,定义一个新的变量j,使j的范围在2~i-1之间,考虑到j从2开始,即起始位置为j=2,终止位置为i-1,即循环条件为j<=i-1,因为要将i与2~i-1的数分别相除,所以每次循环后i增加1,即控制条件为j++。

综上,应使用for循环。>>for (j = 2; j < =i - 1; j++)

//假设我们要打印100-200之间的素数 

  1. #include <stdio.h>
  2. int main()
  3. {
  4. int i = 0;
  5. for (i = 100; i <= 200; i++)//控制i的范围在100-200之间
  6. {
  7. int j = 0;
  8. int flag = 1;//flag=1,假设i是素数
  9. for (j = 2; j <= i - 1; j++)//用2~i-1之间的数试除
  10. {
  11. if (i % j == 0)//说明j能够整除i,即2~i-1之间有数能够整除i,说明i不是素数
  12. {
  13. flag = 0;//说明i不是素数
  14. break;//这时因为i不是素数了,即已经在2~i-1之间找到数能够整除i,找到一个就可以说明
  15. //i不是素数了,因此不用继续判断是否接下来还会有数整除i,因此可以提前结束循
  16. //环,故break跳出循环
  17. }
  18. }
  19. if (flag == 1)//上一步跳出循环只是跳出了内部循环,即只是判断了100~200之间的其中一个数字
  20. //不是素数,但除此之外还有其他数字需要判断,在这些判断后的结果中有是素数
  21. //的,有不是素数的,因此还需要加以判断,从中筛选出是素数的部分
  22. printf("%d ", i);//打印素数
  23. }
  24. return 0;
  25. }

方法二:改进试除法(缩小试除的范围)

假设m不是素数,m=a*b,则a和b中至少会有一个数小于等于{\color{Red} {\color{Red} }}\sqrt{m}

例如:18=2*9--------2<\large {\color{Red} ^{\sqrt{18}}}

因此可以缩小内层for循环的范围,即for(j=2;j<=sqrt(i);j++)

注:sqrt(i)为一个开平方的库函数,使用时需要引用头文件#include<math.h>

则改进后的代码为:

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int i = 0;
  6. for (i = 100; i <= 200; i++)
  7. {
  8. int j = 0;
  9. int flag = 1;
  10. for (j = 2; j <=sqrt(i); j++)//改进
  11. {
  12. if (i % j == 0)
  13. {
  14. flag = 0;
  15. break;
  16. }
  17. }
  18. if (flag == 1)
  19. printf("%d ", i);
  20. }
  21. return 0;
  22. }

方法三:改进素数查找的循环范围

因为是素数,所以第一个数一定不能是偶数,因此从101开始,而两个素数之间至少差1,且所以可以改进外层for循环的控制条件,即将i++改成i+=2;

for(i=101;i<=sqrt(i);i+=2)

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main()
  4. {
  5. int i = 0;
  6. for (i = 101; i <= 200; i+=2)//改进
  7. {
  8. int j = 0;
  9. int flag = 1;
  10. for (j = 2; j <=sqrt(i); j++)
  11. {
  12. if (i % j == 0)
  13. {
  14. flag = 0;
  15. break;
  16. }
  17. }
  18. if (flag == 1)
  19. printf("%d ", i);
  20. }
  21. return 0;
  22. }

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

闽ICP备14008679号