7-4 列出完数 (10 分)

输入一个整数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

可以把完数判断封装成独立函数,然后每输入一个整数就调用函数判断所有因子和。如果和该整数相等就是完数。

代码及运行结果如下,如有帮助,请帮忙点一下我的回答下方的采纳此答案按钮,谢谢。

img

代码:

#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);
        }     
    }
}