Python编程PTA题解——找完数
Description:所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。Input:输入仅一行,输入2个正整数m和n(1<m≤n≤10000),中间以空格分隔。Output:逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + ..
·
Description:所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数m和n之间的所有完数。
Input:输入仅一行,输入2个正整数m和n(1<m≤n≤10000),中间以空格分隔。
Output:逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。
Sample Input:
2 30
Sample Output:
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
10000以内的完数如下:
1 = 1
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
8128 = 1 + 2 + 4 + 8 + 16 + 32 + 64 + 127 + 254 + 508 + 1016 + 2032 + 4064
我们可以发现对于它们的因数除了“1”这个因数外,都是前后对应的
比如 :
2 * 4064 = 8128
4 * 2032 = 8128
8 * 1016 = 8128
16 * 508 = 8128
......
所以只要找到前面的因数,再拿其整除它本身就可以了
import math
m, n = map(int, input().split())
t = True #判断是否有完数
for k in range(m, n + 1):
num = [1]
for a in range(2, int(math.sqrt(k)) + 1):
if k % a == 0:
num.append(a)
if a * a != k: #这里是防止前面找到的因数被重复加入列表
num.append(k // a) #通过整除找到后面对应的一个因数
if sum(num) == k:
t = False
num.sort()
print(k, "=", end=' ')
print(*num, sep=" + ")
if t:
print("None")
更多推荐



所有评论(0)