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

完美数统计程序故障:循环变量j在模运算中异常归零?

问题任务

编写程序从键盘读取自然数直到输入0,统计其中完美数的个数。预期输入输出:输入6 28 0时输出“there are 2 perfect numbers”;输入28 496 0时输出“there are 2 perfect numbers”。

故障现象

用户编写的C代码中,第二个for循环内的变量j打印输出时表现正常,但在模运算判断条件j % array[i] == 0中逻辑异常,导致程序无法正确统计完美数。用户定位到该模运算代码段,疑惑问题根源。

用户代码
#include <stdio.h>

int main() {
    int array[100], perfect = 0;
    int j;
    for (int i = 0; i < 100; i++) {
        scanf("%i", &array[i]);
        if ( array[i] == 0) {
            break;
        }
    }
    for (int i = 0; i < 100; i++) {
        if ( array[i] == 0 ){
            break;
        } else {
            int perf = 0;
             for ( j = 0; j < array[i]; j++) {
                printf("%i\n", j);
                    if ( j % array[i] == 0) {
                        perf += j;
                    }
            }
            if (perf == array[i]) {
                perfect++;
            }
        }
    }
    
    printf("there are %i perfect numbers", perfect);
}
疑问代码段
if ( j % array[i] == 0) {
    perf += j;
}
问题根源与修正

你犯了两个关键错误:

  1. 模运算逻辑完全搞反:完美数要求统计「除自身外所有正约数的和」,判断j是不是array[i]的约数,应该用array[i] % j == 0——表示array[i]能被j整除,j是它的约数。你写的j % array[i] == 0是在判断j是不是array[i]的倍数,这和找约数的逻辑完全相反。
  2. 循环起始值错误:j从0开始毫无意义,0不是正整数,完美数的约数是正约数,所以j应该从1开始循环。

修正后的代码片段:

for (j = 1; j < array[i]; j++) {
    if (array[i] % j == 0) {
        perf += j;
    }
}

这样就能正确计算每个数的正约数之和,进而准确判断是否为完美数。

内容的提问来源于stack exchange,提问作者ramses

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 05:25:14