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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:36:03