7-134 列出完数
输入一个整数n,要求输出[1,n]范围内的所有完数。完数是一个正整数,该数恰好等于其所有不同真因子之和。例如,6、28是完数,因为6=1+2+3,28=1+2+4+7+14;而24不是完数,因为24≠1+2+3+4+6+8+12=36。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据输入一个整数n(1≤n≤10000)。
输出格式:
对于每组测试,首先输出n和一个冒号“:”;然后输出所有不大于n的完数(每个数据之前留一个空格);若[1,n]范围内不存在完数,则输出“NULL”。引号不必输出。具体输出格式参考输出样例。
输入样例:
100 5000 5
输出样例:
100: 6 28 5000: 6 28 496 5: NULL
出处:
ZJUTOJ 1190
#include <stdio.h>
int main() {
int n;
// num表示完数数量
int num = 0;
// fs表示完数数组
int fs[100];
for (int i = 1; i <= 10000; ++i) {
int temp = 0;
for (int j = 1; j <= i / 2; ++j) {
if (i % j == 0) {
temp += j;
}
}
if (temp == i) {
fs[num] = temp;
num++;
}
}
while (scanf("%d", &n) != EOF) {
printf("%d:",n);
for (int i = 0; i < num; ++i) {
if(fs[0]>n){
printf(" NULL");
break;
} else if(fs[i]<=n){
printf(" %d",fs[i]);
} else if(fs[i]>n){
break;
}
}
printf("\n");
}
return 0;
}
思路
- 首先求出1-10000的所有完数放进数组,再去看输入的数字。
- 如果第一个完数就大于输入的数字则表示没有完数输出NULL。
- 如果数组中第i个数小于等于输入的数则输出这个完数,如果遇到一个大于n的则表示后面没有完数在该范围内了,结束循环
- 第一步如何判断该数是不是完数,可以去看文章7-165有具体解释,这里不再赘述