输入一个整数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
可以把完数判断封装成独立函数,然后每输入一个整数就调用函数判断所有因子和。如果和该整数相等就是完数。
代码及运行结果如下,如有帮助,请帮忙点一下我的回答下方的采纳此答案按钮,谢谢。
代码:
#include <stdio.h>
int main()
{
int n,i,j;
int sum = 0,cnt = 0;
while(scanf("%d",&n) != EOF)
{
cnt = 0;
printf("%d:",n);
for(i=1;i<=n;i++)
{
sum = 0;
for(j=1;j<i;j++)
{
if(i%j==0) sum += j;
}
if(sum == i)
{
cnt++;
if(cnt == 1)
printf("%d",i);
else
printf(" %d",i);
}
}
if (cnt == 0)
printf("NULL");
printf("\n");
}
return 0;
}
#include <stdio.h>
void main(){
int i,j;
int num;//因子之和
int n;
scanf("%d",&n);
printf("%d:",n);
for(i=2;i<=n;i++){
num = 0;
//printf("%d的因子如下:",i);
for(j=2;j<=i;j++){ //j代表i对应的任何一个可能的因子
if(i %j == 0){
num += i/j; //3,2,1
//printf("%d+",i/j);
}
}
//printf("\n");
//判断因子之和是否和该数相等
if(num==i){
printf("%d ",i);
}
}
}