[题目描述]
古希腊数学家毕达哥拉斯在自然数研究中发现,220 的所有真约数(即不是自身的约数)之和为:
1+2+4+5+10+11+20+22+44+55+110=284 。
而 284 的所有真约为 1 、 2 、 4 、 71 、 142 ,加起来恰好为 220 。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
你的任务就编写一个程序,判断给定的两个数是否是亲和数。
输入格式:
输入数据第一行包含一个数 M ,接下有 M 行,每行一个实例,包含两个整数 A , B 。
输出格式:
对于每个测试实例,如果 A 和 B 是亲和数的话输出YES,否则输出NO。
样例输入
2
220 284
100 200
样例输出
YES
NO
数据范围:
对于 100% 的数据,保证 1≤A,B≤600000 。
来源/分类(难度系数:一星)
完整代码展示:
a=int(input())
b=[]
for i in range(a):
c=list(map(int,input().split()))
b.append(c)
d=0
while d<len(b):
e=b[d][0]
f=b[d][1]
g=[]
h=[]
for j in range(1,e):
if e%j==0:
g.append(j)
for k in range(1,f):
if f%k==0:
h.append(k)
if sum(g)==f and sum(h)==e:
print("YES")
else:
print("NO")
d+=1
代码解释:
“a=int(input())
b=[] ”,让用户输入需要测试的数据组数a。建立一个空列表b。
“for i in range(a):
c=list(map(int,input().split()))
b.append(c) ”,建立一个列表c,储存每组需要测试的数据,并将其添加进列表b中。重复以上操作循环a次。
“d=0
while d<len(b):
e=b[d][0]
f=b[d][1]
g=[]
h=[]
for j in range(1,e):
if e%j==0:
g.append(j)
for k in range(1,f):
if f%k==0:
h.append(k)
if sum(g)==f and sum(h)==e:
print("YES")
else:
print("NO")
d+=1 ”,令d==0,当d<len(b)时,令e==b[d][0],f==b[d][1],建立两个空列表g,h。遍历从1到e-1的所有数,查找能被e整除的数字,并将其添加进列表g中,直至循环结束;列表h同理。两次循环均结束后,判断列表g中所有元素的总和是否为f,同时判断列表h中所有元素的总和是否为e;如果均是,则输出“YES”,否则输出“NO”。每循环一次,就让d+=1,直至d==len(b),跳出整个while循环。
运行效果展示:
(声明:以上内容均为原创)