CS50 Prime题目疑惑:移除else返回true后程序正常的原因
CS50 Prime题:错误代码的问题解析
在完成CS50第1课的Prime题目时,要求通过for循环、模运算、布尔函数找出指定范围内的素数。你编写的初始代码仅输出奇数,移除一段else分支代码后程序恢复正常,下面解析其中的原因:
初始错误代码
#include "cs50.h" #include <stdio.h> bool prime(int number); int main(void) { int min; do { min = get_int("Minimum: "); } while (min < 1); int max; do { max = get_int("Maximum: "); } while (min >= max); for (int i = min; i <= max; i++) { if (prime(i)) { printf("%i\n", i); } } } bool prime(int number) { if (number < 2) { return false; } for (int i = 2; i < number; i++) { if (number % i == 0) { return false; } else { return true; } } return number; }
错误根源
问题出在prime函数的for循环逻辑里:
- 循环第一次执行时(
i=2),只要number % 2 != 0(即number是奇数),就会立刻进入else分支返回true,完全跳过了后续的除数检查。 - 比如判断9是否为素数时,第一次
i=2,9%2=1≠0,函数直接返回true,但实际上9能被3整除,并非素数。 - 而除2以外的偶数,会在第一次
i=2时触发number%i==0,返回false,所以程序只会输出所有奇数,不管它是不是素数。
移除代码后的正确逻辑
删掉那段else返回true的代码后,函数逻辑变得正确:
- 先排除小于2的数,直接返回
false。 - 对从2到
number-1的每个i,依次检查是否能整除number:- 只要找到一个能整除的
i,立刻返回false(不是素数)。 - 如果循环完整执行完毕,说明没有任何
i能整除number,此时才返回true(是素数)。
- 只要找到一个能整除的
修改后的prime函数可以优化为更规范的写法:
bool prime(int number) { if (number < 2) { return false; } for (int i = 2; i < number; i++) { if (number % i == 0) { return false; } } return true; // 明确返回布尔值,替代原有的return number }
内容的提问来源于stack exchange,提问作者joyceljx
相关产品推荐
相关产品推荐

