You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的代码后,函数逻辑变得正确:

  1. 先排除小于2的数,直接返回false。
  2. 对从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 21:45:30