geo_analysisの日記

エンジニアになりたい無職のProjectEuler

プロジェクトオイラー30

ProjectEulerの問題30をPython3を使って解きました。
問題
Problem 30 - Project Euler

この問題は、自然数nで、
n = nの各桁の数字の5乗の和
となるものを見つけ、全て足し合わせなさいという問題です。コンピュータに上の式を満たす自然数を計算させるだけで良いのですが、上限を定めないといつまでも終わりません。そこで大雑把にまず、10^n > 9^5 ×n となる自然数 n を見つけます。この n が上限になることは明らかです。後はプログラムを書くだけ。

import time
start = time.time()
n = 1 #n桁の整数 = 各桁の整数の5乗の和 となり得る桁数nの上限
while 10**n <= (9**5) * n:
    n += 1
'''
上を実行するとn <= 6だとわかる
'''
integers = [(a, b, c, d, e, f) \
            for a in range(10) \
            for b in range(10) \
            for c in range(10) \
            for d in range(10) \
            for e in range(10) \
            for f in range(10) ] #6桁までの整数を表す
answer = -1 #問の答え(1 = 1^5 を除く)
for a, b, c, d, e, f in integers: #整数 = 各桁の整数の5乗の和となる数を見つけて足すぜ!
    if 100000*a + 10000*b + 1000*c + 100*d + 10*e + f == a**5 + b**5 + c**5 + d**5 + e**5 + f**5:
        answer += 100000*a + 10000*b + 1000*c + 100*d + 10*e + f
print(answer)
print(time.time() - start)

f:id:geo_analysis:20160718001139p:plain