为何我的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
相关产品推荐
相关产品推荐

