完美数统计程序故障:循环变量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; }
问题根源与修正
你犯了两个关键错误:
- 模运算逻辑完全搞反:完美数要求统计「除自身外所有正约数的和」,判断
j是不是array[i]的约数,应该用array[i] % j == 0——表示array[i]能被j整除,j是它的约数。你写的j % array[i] == 0是在判断j是不是array[i]的倍数,这和找约数的逻辑完全相反。 - 循环起始值错误:
j从0开始毫无意义,0不是正整数,完美数的约数是正约数,所以j应该从1开始循环。
修正后的代码片段:
for (j = 1; j < array[i]; j++) { if (array[i] % j == 0) { perf += j; } }
这样就能正确计算每个数的正约数之和,进而准确判断是否为完美数。
内容的提问来源于stack exchange,提问作者ramses
相关产品推荐
相关产品推荐

