1 题目
一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。
因子:假如整数n除以m,结果是无余数的整数,那么我们称m就是n的因子
2 分析
本题想要验证某个数,必须计算它的因子,计算因子的方法见 C语言经典例14-将一个正整数分解质因数 ,计算出因子后,在求和判断即可
3 实现
#include <stdio.h>
int main() {
int a[100]; // 临时数组用于保存因子
for (int i = 2; i <= 1000; i++) {
int sum = 1; // 1是所有数的因子,直接保存
a[0] = 1;
int k = 0; // k用于保存数组中储存了多少因子,用于最后输出
for (int j = 2; j <= (i/2); j++) { // 分解因子
if (i % j == 0) { // 若能整除则j为因子之一
sum += j; // 累加因子到总和
a[++k] = j; // 将因子保存到数组中,移动数组标号
}
}
if (i == sum) { // 判断该数的因子的和是否等于该数
printf("%d = %d", i, a[0]); // 输出计算式
for (int n = 1; n <= k; n++) {
printf(" + %d", a[n]);
}
printf("\n");
}
}
return 0;
}
4 运行结果
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248