C语言区间素数查找程序求助:程序误打印所有数字
修复C语言素数检测程序的问题
原代码的核心问题
- 函数职责错位:
isPrime函数本该负责判断一个数是否为素数,但原代码在循环中直接打印i,完全偏离了函数的核心功能。 - 逻辑逻辑混乱:原函数中只要
flag为0就打印i,导致循环过程中的每个i都被输出,而非判断目标数number是否为素数。 - 缺少返回值:
isPrime声明为int类型但无返回语句,属于未定义行为。 - 边界情况未处理:未考虑
number < 2的情况(1、0、负数都不是素数)。
修正后的完整代码
// 判断一个数是否为素数,返回1表示是素数,0表示不是 int isPrime(int number) { // 小于2的数直接排除 if (number < 2) { return 0; } // 2是唯一的偶素数 if (number == 2) { return 1; } // 偶数(除2外)直接排除 if (number % 2 == 0) { return 0; } // 只需要检查到sqrt(number),且只遍历奇数,优化效率 for (int i = 3; i * i <= number; i += 2) { if (number % i == 0) { return 0; } } return 1; } int main() { int x, y; scanf("%d %d", &x, &y); // 遍历区间内的每个数,调用isPrime判断后打印素数 for (int i = x; i <= y; ++i) { if (isPrime(i)) { printf("%d\n", i); } } return 0; }
修正说明
- 让
isPrime专注于素数判断,返回布尔标识(1/0),由主函数负责打印操作,符合单一职责原则。 - 补充边界处理:直接排除小于2的数、偶数(除2外),减少无效判断。
- 优化循环效率:仅遍历到目标数的平方根,且只检查奇数,大幅减少循环次数。
- 补全函数返回值,避免未定义行为。
内容的提问来源于stack exchange,提问作者Marco Miguelote
相关产品推荐
相关产品推荐

