题目

描述

一个大于1的整数,如果它恰好等于它的所有因子(本身除外)之和,这个数就称为“完数”。

例如:6 = 1 + 2 + 3。

要求:输入n(2≤n≤10000),编程找出n以内的所有完数,若不存在完数,则输出0

输入格式

一个整数n

输出格式

从小到大每行输出一个完数。

样例

输入数据 1

1000

输出数据 1

6
28
496

提示

相同的因子只能累加一次哦

分析

我们可以用多重循环来实现题目的要求,先用一个for循环从2开始到n一一判断是否为完数,同时用第二个循环找到因子相加并判断其是否为完数。

在寻找因子并相加这个步骤,虽然我们很快能想到只要从2循环到这个数,并判断是否为因子,再用一个变量将其累加起来判断是否为完数即可,但是很有可能Runtime Error,那这时候我们就可以联想到判断素数时的思路从2开始判断到n开根号),我们可以沿用这种思路来优化我们判断一个数是否为完数时的循环范围,试想如果一个数i它是某个数的因子,那这个数除以i得出的结果肯定也是它的因子(以20举例,因为2是它的因子,所以10也必然是它的因子),因此我们只需循环到某个数开根号即可,明确了这个点就能解决超时的问题了。

代码

n = int(input())
ans = 1
k = 0
for i in range(2, n + 1):
    for j in range(2, int(i ** 0.5) + 1):
        if i % j == 0:
            ans += j + i / j
    if ans == i:
        k += 1
        print(i)
    ans = 1
if k == 0:
    print(0)
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐