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

完美数判断函数代码异常求助:新手编程逻辑排查

问题排查与修复方案

你的代码存在几个关键问题,导致无法正确判断完美数,以下是逐一分析和修复:

1. 除零错误

循环从i=0开始,当i=0时执行n % i会触发除零未定义行为,程序可能崩溃或输出错误结果。完美数的真因子从1开始,所以循环起始值应改为i=1,同时可以去掉i != 0的判断(因为i从1开始,不会为0)。

2. 循环范围冗余

循环到i < n完全没必要,因为大于n/2的数不可能是n的真因子(除了n本身,而真因子不包含自身)。将循环条件改为i <= n/2能大幅减少循环次数,提升效率。

3. 边界值处理

完美数的定义是正整数,如果输入的n <= 0,直接返回0即可,无需进入循环判断。

修复后的完整代码

#include <stdio.h>

int PerfectNumber(int n){
    // 完美数必须是正整数,直接排除非正输入
    if (n <= 0) {
        return 0;
    }
    int sum = 0;
    // 从1开始遍历到n/2,寻找所有真因子
    for (int i = 1; i <= n / 2; i++){
        if(n % i == 0){
             sum += i;
        }
    }
    return sum == n ? 1 : 0;
}

int main(){
    printf("Inform a number:\n");
    int n;
    scanf(" %d", &n);

    int result = PerfectNumber(n);
    if(result == 1){
        printf("This is a perfect number!\n");
    } else {
        printf("This is not a perfect number!\n");
    }
    return 0;
}

测试示例

  • 输入6(最小的完美数),程序会输出This is a perfect number!
  • 输入28,同样会判定为完美数
  • 输入10,会输出This is not a perfect number!

内容的提问来源于stack exchange,提问作者user17321439

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:18:37