test 6.2 完数(5分)

一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3(6的因子是1,2,3)。

题目内容

一个正整数的因子是所有可以整除它的正整数。而一个数如果恰好等于除它本身外的因子之和,这个数就称为完数。例如6=1+2+3(6的因子是1,2,3)。

现在,你要写一个程序,读入两个正整数n和m(1<=n<m<1000),输出[n,m]范围内所有的完数。

提示:可以写一个函数来判断某个数是否是完数。

输入格式

两个正整数,以空格分隔。

输出格式

其间所有的完数,以空格分隔,最后一个数字后面没有空格。如果没有,则输出一行文字:
NIL
(输出NIL三个大写字母加回车)。

输入样例

1 10

输出样例

6

限制

时间限制:500ms 内存限制:32000kb

代码实现

C语言

#include<stdio.h>

int isPerfect(int n)
{
    int isPerfect = 0;
    int sum = 0;
    if (n > 1)
    {
        for (int i = 1; i < n / 2 + 1; i++)
        {
            if (n % i == 0)
            {
                sum += i;
            }
        }
        if (n == sum)
        {
            isPerfect = 1;
        }       
    }
    return isPerfect;
}


int main() 
{
    int n, m;
    scanf("%d %d", &n, &m);

    int cnt = 0;
    for (int i = n; i <= m; i++)
    {       
        if (isPerfect(i))
        {
            if (cnt > 0)
            {
                printf(" ");
            }           
            printf("%d", i);
            cnt ++;
        }
    }
    if (cnt == 0)
    {
        printf("NIL\n");
    }

    return 0;
}

Python

def isPerfect(n):
    numbersum = 0
    check = 0

    if n > 1:
        for i in range(1, int(n / 2 + 1)):
            if n % i == 0:
                numbersum += i
        if n == numbersum:
            check = 1

    return check


def main():
    s = input()
    lst = s.split()
    n = int(lst[0])
    m = int(lst[1])
    perfect_list = []

    for i in range(n, m + 1):
        if isPerfect(i):
            perfect_list.append(str(i))

    if perfect_list:
        print('NIL\n')
    else:
        print(' '.join(perfect_list))


main()