一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如:6的因子为1,2,3,而6=1+2+3,因此6是完数。输入整数n,编程找出2-n(包括n)之内的所有完数,并按下列格式输出其因子:6 its factors are 1 2 3。
输入格式:
输入整数n(n在2-10000之间)
输出格式:
每行输出一个完数,格式如下:因子间有一个空格隔开,每行结束后也有一空格。
6 its factors are 1 2 3
......
输入样例:
10
输出样例:
6 its factors are 1 2 3
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
思路:
-
输入整数 n。
-
使用双重循环遍历区间 [2, n] 中的每个数 x,并且对于其中的每个可能因子 y,检查是否存在一种组合方式,使得其和等于 x。如果存在这样的组合方式,则 x 是一个完数,输出其因子。
-
在循环中需要使用一个数组来记录所有满足条件的因子。找到完数后,将其输出并在用循环结构遍历记录其因子的数组,输出数组中内容即可。
代码
#include <stdio.h>
int main()
{
int n, i, j, sum;
int factors[10000]; // 用于记录因子的数组
scanf("%d", &n);
for (i = 2; i <= n; i++) {
sum = 0; // 清空上一个数的所有因子
int k = 0; // 记录满足条件的因子数量
for (j = 1; j < i; j++) {
if (i % j == 0) { // 找到了一个因子
sum += j; // 累加该因子
factors[k++] = j; // 将该因子保存到数组中
}
}
if (sum == i) { // 如果当前数是完数
printf("%d its factors are ", i); // 输出该完数和因子
for (int m = 0; m < k; m++) {
printf("%d ", factors[m]); // 遍历输出所有的因子
}
printf("\n"); // 换行
}
}
return 0;
}