C语言校验数组元素是否为完全数及约数求和问题排查
你的代码核心问题是sum变量的初始化时机不对:你把sum定义在所有循环的最外层,只在程序启动时初始化了一次0,之后计算每个输入元素的约数和时都在之前的sum结果上累加,自然会把所有元素的约数都算到一起。
以下是两种场景的修正方案:
方案1:不需要留存所有输入元素,输入一个处理一个(更省内存)
#include <stdio.h> int main() { int input, j, sum; // 循环接收输入,直到输入0停止 while(1) { scanf("%d", &input); if (input == 0) { break; } // 每次计算新数的约数和前先把sum清零 sum = 0; printf("%d的正约数(除自身外):", input); for (j = 1; j < input; j++) { if (input % j == 0) { printf("%d ", j); sum += j; } } // 判断是否为完全数 if (sum == input) { printf("\n%d 是完全数\n\n", input); } else { printf("\n%d 不是完全数,约数和为%d\n\n", input, sum); } } return 0; }
方案2:需要留存所有输入的元素到数组,后续可二次处理
#include <stdio.h> #define MAX_ARR_LEN 1000 // 固定最大数组长度兼容性更好,避免变长数组的兼容性问题 int main() { int v[MAX_ARR_LEN]; int i = 0, j, sum; while(i < MAX_ARR_LEN) { scanf("%d", &v[i]); if (v[i] == 0) { break; } sum = 0; printf("%d的正约数(除自身外):", v[i]); for (j = 1; j < v[i]; j++) { if (v[i] % j == 0) { printf("%d ", j); sum += j; } } if (sum == v[i]) { printf("\n%d 是完全数\n\n", v[i]); } else { printf("\n%d 不是完全数,约数和为%d\n\n", v[i], sum); } i++; } return 0; }
主要改动说明
- 把
sum的初始化放到了每个输入元素的处理逻辑开头,每计算一个新数的约数和前都会清零,不会和之前的结果叠加 - 补充了完全数的判断逻辑,每个元素计算完约数和后直接输出判断结果
- 用固定长度数组替代了变长数组,兼容性更好,支持C89及以上标准的编译器都能正常编译运行
内容的提问来源于stack exchange,提问作者plaguedoctor24
相关产品推荐
相关产品推荐

