题目描述
求完数
整数6的因子包括1、2和3,巧合的是6=1+2+3,像6这样所有因子之和恰好等于自身的数称为“完数”。
编写程序找出m至n之间的所有完数。
输入格式:
请在这里写输入格式。例如:输入两个正整数m 、n,要求 m <= n <=10000。
输出格式:
请在这里描述输出格式。例如:输出符合条件的完数,各数之间使用空格隔开。
输入样例:
在这里给出一组输入。例如:
10 100
输出样例:
在这里给出相应的输出。例如:
28 = 1 + 2 + 4 + 7 + 14
解题思路
首先,我们要循环遍历m到n之间的每个数。
然后,对于每个数,判断是否是完数。
最后,按照输出格式要求输出符合条件的完数即可。
这个问题从思路上来看其实不难,麻烦的是PTA对输出格式要求很严格,以下是对这部分代码的解析:
-
factor_list = [str(factor) for factor in range(1, num) if num % factor == 0]
这行代码创建了一个列表factor_list
,其中包含了所有能够整除num
的因子的字符串形式。
让我们逐步解析这行代码:range(1, num)
:创建一个从 1 到num
(不包括num
)的迭代器。for factor in range(1, num)
:遍历迭代器中的每个元素,将当前元素赋值给变量factor
。if num % factor == 0
:检查当前元素是否能够整除num
。如果能整除,则条件成立。str(factor)
:将当前因子转换为字符串形式。[str(factor) for factor in range(1, num) if num % factor == 0]
:通过列表推导式,将满足条件的因子转换为字符串,并将它们组成一个新的列表。- 最终,
factor_list
的值就是所有能够整除num
的因子的字符串形式的列表。例如,如果num
是 6,那么factor_list
的值就是['1', '2', '3']
。
-
factor_str = ' + '.join(factor_list)
在这行代码中,' + '.join(factor_list)
的作用是将factor_list
中的元素用' + '
连接起来成为一个字符串。例如,如果factor_list
是['1', '2', '3']
,那么这行代码的结果就是'1 + 2 + 3'
。
Python代码实现
# 判断一个数是否是完数
def is_perfect_number(num):
factors = [1] # 初始化因子列表,先加入1作为所有正整数的因子
# 寻找所有因子并求和
for i in range(2, int(num**0.5) + 1): # 从2到sqrt(num)遍历
if num % i == 0: # 如果是num的因子
factors.append(i) # 将因子加入列表
if i != num // i: # 如果不是相同的因子,加入对应的另一个因子
factors.append(num // i)
return sum(factors) == num # 判断因子之和是否等于num本身,返回布尔值
# 读取输入的两个正整数 m 和 n
m, n = map(int, input().split())
# 遍历从 m 到 n 的整数,找出完数并输出
for num in range(m, n + 1):
if is_perfect_number(num): # 调用is_perfect_number函数判断是否是完数
factor_list = [str(factor) for factor in range(1, num) if num % factor == 0] # 找出所有因子
factor_str = ' + '.join(factor_list) # 将因子用加号连接成字符串
print(f"{num} = {factor_str}") # 输出完数及其因子的表达式