完美数判断函数代码异常求助:新手编程逻辑排查
问题排查与修复方案
你的代码存在几个关键问题,导致无法正确判断完美数,以下是逐一分析和修复:
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
相关产品推荐
相关产品推荐

