AtCoder Regular Contest 026 B – 完全数 をPython3で解く

Share

AtCoder上にある問題のうち、AtCoder Problemsでdiff 800以上と判定されているものを順番に解いていく企画。
基本的な考え方は全てコード中のコメントに入れてあるので、参照のこと。

出典:
AtCoder Regular Contest 026 B – 完全数

コーナーケースに引っかかる人と、コーナーケースがあったことすら気づかない人に分かれそうな問題。僕は解くたびに引っかかってるような……。

# AtCoder Regular Contest 026 B - 完全数
# https://atcoder.jp/contests/arc026/tasks/arc026_2
# tag: 整数 完全数 約数 約数列挙 コーナーケース 高橋君

# 約数を列挙し、合計して確認するだけ……
# なのだが、実は 1で割るときの処理を間違うとコーナーケースに
# 引っかかる。(N=1)

# ここでは、素直に全約数を足し合わせた後、自分自身の分を
# 引いている。

def main():
N = int(input())

# 約数を列挙しながら足していく。
sum_div = 0
for i in range(1, int(N**0.5) + 1):
if N % i == 0:
sum_div += i
if i ** 2 != N:
sum_div += N // i

# 自分自身は除く。
sum_div -= N

if sum_div < N:
print('Deficient')
elif sum_div == N:
print('Perfect')
else:
print('Abundant')

main()
Share

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です