- 本記事はProjectEulerの「100番以下の問題の説明は記載可能」という規定に基づいて回答のヒントが書かれていますので、自分である程度考えてみてから読まれることをお勧めします。
問題 30:各桁の5乗の和
原文 Problem 30: Digit fifth powers
問題の要約:各桁の5乗の和が元の数と同じになる数の合計を求めよ
この問題では数の範囲が指定されていないので、どこまで調べれば良いかがポイントですね。桁数が$d$のとき各桁の5乗の和の最大値は$(9^5 \times d)$となるのでプログラムで調べてみると。
for d in range(1,8):
print(f"digit={d}, {10**(d-1)}-{10**d-1} {1}-{9**5*d}")
d=1, 1-9 1-59049
d=2, 10-99 1-118098
d=3, 100-999 1-177147
d=4, 1000-9999 1-236196
d=5, 10000-99999 1-295245
d=6, 100000-999999 1-354294
d=7, 1000000-9999999 1-413343
7桁になると2つの値の範囲が重なっていないので、6桁まで、より正確にいうと$9^5*6=354294$までチェックすればよいので、以下のプログラムになります。
def digPowSum(n,pw):
return sum([int(d)**pw for d in str(n)])
print(f"Answer: {sum([n for n in range(2,(9**5)*6+1) if n==digPowSum(n,5)])}")
(開発環境:Google Colab)