[題目描述]
古希臘數學家畢達哥拉斯在自然數研究中發現,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循環。
運行效果展示:
?
? ? ?? ? ? ? ?(聲明:以上內容均為原創)?
?