使用Continue控制流无法判定质数,程序无输出原因咨询
问题分析与修复方案
嘿,这问题其实挺典型的,咱们一步步拆解:
1. 核心问题:continue 让 printf 永远无法执行
你写的代码里,continue 语句放在了 printf("prime\n"); 的前面——而 continue 的作用是立即跳过循环体中剩余的所有代码,直接回到循环的条件判断环节。也就是说:
- 只要进入
if(n%i!=0)的分支,程序会直接跳回for循环的i++步骤,后面的printf根本没机会运行; - 如果没进入这个分支(也就是
n%i==0),整个if块的代码都不会执行,自然也不会触发printf。
这就是程序完全没有输出的直接原因。
2. 质数判断的逻辑完全搞反了
咱们再理清楚质数的定义:质数是大于1的自然数,且只能被1和它本身整除。所以你的循环逻辑应该是:
- 遍历从2到n-1的所有数
i; - 如果存在任意一个
i能整除n,说明n不是质数,直接终止循环; - 如果循环正常结束(遍历完所有
i都没找到能整除n的数),说明n是质数,再输出结果。
修正后的代码示例
#include<stdio.h> int main() // 注意:main函数的标准返回类型是int { int n, i; scanf("%d", &n); // 先处理特殊情况:n小于2的话肯定不是质数 if (n < 2) { printf("not prime\n"); return 0; } // 遍历判断是否存在因数 for(i = 2; i < n; i++) { if(n % i == 0) // 找到能整除的数,说明不是质数 { printf("not prime\n"); return 0; // 直接终止程序,不用继续循环了 } } // 循环正常结束,说明没找到因数,是质数 printf("prime\n"); return 0; }
额外优化建议
如果想让程序更高效,可以把循环的上限改成sqrt(n)——因为如果n有一个大于sqrt(n)的因数,那必然对应一个小于sqrt(n)的因数,这样能大幅减少循环次数。优化后的代码如下:
#include<stdio.h> #include<math.h> // 需要引入math库 int main() { int n, i; scanf("%d", &n); if (n < 2) { printf("not prime\n"); return 0; } int sqrt_n = sqrt(n); for(i = 2; i <= sqrt_n; i++) { if(n % i == 0) { printf("not prime\n"); return 0; } } printf("prime\n"); return 0; }
内容的提问来源于stack exchange,提问作者Rishi Srivastava
相关产品推荐
相关产品推荐

