C语言质数遍历代码逻辑疑问及输出越界问题咨询
问题解答与代码修正
疑问1解答
当外层循环变量i从4变为5时,内层循环的j会重置为2。因为内层for循环的初始化语句j=2会在每次进入内层循环时执行,所以检查5的时候,j会从2开始逐一验证,不会跳过除以2的步骤。但你原代码里的严重问题是在内层循环中修改了外层循环的i,这会彻底打乱外层循环的遍历逻辑,导致后续判断完全混乱。
疑问2解答
输入10时输出11,是因为内层循环里的i += 1操作导致i的值被意外增大,超出了num的限制。比如当i接近输入值时,内层循环修改i后,后续的printf会直接输出这个被篡改的i,最终出现超过输入数字的错误结果。
原代码的核心问题
在内层循环中直接修改外层循环的控制变量i,破坏了循环的正常迭代逻辑,这是导致各种异常输出的根本原因。判断质数的正确逻辑应该是:对每个i,检查是否存在能整除它的j,如果存在则i不是质数,否则是质数,整个过程不应修改外层的i。
修正后的代码
#include <stdio.h> int main() { int num; printf("please enter num: "); scanf_s("%d", &num); if (num < 2) { printf("No primes less than 2.\n"); return 0; } int i, j; // 遍历2到输入数字的所有数(包含输入值) for (i = 2; i <= num; i++) { int is_prime = 1; // 标记当前数是否为质数,初始为是 // 优化:只需检查到i的平方根即可 for (j = 2; j * j <= i; j++) { if (i % j == 0) { is_prime = 0; // 能被整除,标记为非质数 break; // 无需继续检查 } } if (is_prime) { printf("%d ", i); } } printf("\n"); return 0; }
代码说明
- 增加边界判断:输入小于2时直接提示无质数。
- 用
is_prime标记代替修改外层i,避免循环逻辑混乱。 - 内层循环优化为只检查到
i的平方根,减少不必要的计算,提升效率。 - 外层循环条件改为
i <= num,确保输出不超过输入的数字。
内容的提问来源于stack exchange,提问作者artur anikin
相关产品推荐
相关产品推荐

