日期:2025年8月9日
ZeroJudge 題目連結:c184. 盈虧互補
解題想法
先找出 n 包含 1 的因數 fac 及加總 facSum,如果 facSum 等於 n,n 是完全數;如果 facSum 不等於 n,還要再找 facSum 的因數 fac2 及加總 facSum2,如果 facSum2 等於 n,則兩者是友好數。
Python 程式碼
用 set 儲存因數,用 join 組合要輸出的因數加總算式。使用時間約為 39 ms,記憶體約為 3.5 MB,通過測試。
n = int(input()) # 要測試數字 n
fac = {1} # 儲存 n 的因數,先放入 1
for i in range(2, int(n**0.5)+1):
if n%i == 0:
fac.add(i)
fac.add(n//i)
facSum = sum(fac) # n 的因數加總
print("+".join(map(str, sorted(fac))) + "=" + f"{facSum:d}") # 印出 n 的因數及加總
if n == facSum: # 如果 n 等於 facSum
print(f"{n:d} is perfect.") # n 是完全數
elif len(fac) == 1: # 如果 fac 只有 1
print("=0") # 印出 =0
print(f"{n:d} has no friends.") # 不可能有友好數
else: # 其它狀況
n2 = facSum # 要檢測 facSum 是否為友好數
fac2 = {1} # 儲存 n2 的因數,先放入 1
for i in range(2, int(n2**0.5)+1):
if n2%i == 0:
fac2.add(i)
fac2.add(n2//i)
facSum2 = sum(fac2) # n2 的因數加總
print("+".join(map(str, sorted(fac2))) + "=" + f"{facSum2:d}") # 印出 n2 的因數及加總
if facSum2 == n: # 如果 facSum2 等於 n,兩者是友好數
print(f"{n:d} and {n2:d} are friends.")
else: # 否則 n 沒有友好數
print(f"{n:d} has no friends.")