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

为何我的C语言完全数查找程序重复输出结果?

问题分析与修正

你的程序存在两个核心问题,直接导致了重复输出和错误的24被打印:

错误点1:错误包含自身作为约数

完全数的定义是除自身外所有正约数的和等于自身,但你的内层循环j <= i会把i本身也加到累加值k里,这完全违背了完全数的判断逻辑。

错误点2:提前判断累加结果

你在内层循环的每一次迭代后都判断k == i,这会导致累加过程中只要中间值刚好等于i就提前打印(24就是这么被错误输出的),同时正确的完全数也会因为多次满足中间条件而重复打印。


修正后的代码

#include <stdio.h>

int main() {
    int i, j, k;

    for (i = 2; i < 1000; i++) {
        k = 0;
        // 只遍历到i-1,排除自身
        for (j = 1; j < i; j++) {
            if (i % j == 0) {
                k = k + j;
            }
        }
        // 所有约数累加完成后再判断是否为完全数
        if (k == i) {
            printf("%d\n", i);
        }
    }
    return 0;
}

可选优化

内层循环无需遍历到i-1,遍历到i/2即可——因为大于i/2的约数只有i本身,这样能减少循环次数,提升效率:

#include <stdio.h>

int main() {
    int i, j, k;

    for (i = 2; i < 1000; i++) {
        k = 0;
        for (j = 1; j <= i/2; j++) {
            if (i % j == 0) {
                k = k + j;
            }
        }
        if (k == i) {
            printf("%d\n", i);
        }
    }
    return 0;
}

内容的提问来源于stack exchange,提问作者Bence Kostyál-Szilágyi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 10:54:58