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

コメントを残す

メールアドレスが公開されることはありません。