鱼C论坛

 找回密码
 立即注册
查看: 1257|回复: 6

[已解决]C语言break和continu的课后作业,求素数第二个for我看不懂是什么意思

[复制链接]
发表于 2021-11-28 11:30:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-11-28 12:22 编辑

         本代码判断素数采用的是排除法,对于每一个 i,先假定它是一个素数,置 flag = 1,然后,在 2 ~ i / 2 的范围内,循环枚举它可能的因子 j,测试 i % j 的余数,如果余数为 0 了,那就说明 j 是 i 的因子, i 就不是一个素数,于是,否定前期 i 是素数的假设,置 flag = 0,结束对 i 的判断;反之,如果在 2 ~ i / 2 的范围内,居然没有一个 j 能使 i % j == 0,那么,说明开头的假设成立,i 确实是一个素数。

         本代码总体由两个循环嵌套构成,第 1 个 for 是为了在 5 ~ 9999 的范围内,枚举出每一个整数 i,而第 2 个 for 是为了在 2 ~ i / 2 的范围内,循环枚举出 i 所有可能的因子 j ,并挨个测试 i % j 的余数是否为 0。所以, i 是否是素数是在第 2 个 for 中做出判断的,这就是第 2 个 for 存在的作用和价值。

          因为乘法满足交换率,所以,枚举 j 的范围可以进一步缩小到 sqrt(i) 像这样
  1. for(i = 5 ; i < 10000 ; i ++) {
  2.         for(j = 2 ; j * j < i + 1 ; j ++) {
复制代码

          此外,除了 2,所有的素数都是奇数,所以,还可以免去对所有偶数的判断,这样,运算效率会提升一倍。
  1. for(count = 0 , i = 3 ; i < 10000 ; i ++) {
  2.         flag = 0                         ;
  3.         if(i % 2) {
  4.                 for(flag = 1 , j = 3 ; j * j < i + 1 ; j += 2) {
  5.                         if(! (i % j)) {
  6.                                 flag = 0 ;
  7.                                 break    ;
  8.                         }
  9.                 }
  10.         }
  11.         if(flag) count ++                ;
  12. }
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-29 04:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表