Python
ProjectEuler

Project Euler 30「各桁の5乗」

はじめてのジェネレータ関数。

Problem 30 「各桁の5乗」

驚くべきことに, 各桁を4乗した数の和が元の数と一致する数は3つしかない.

1634 = 1^4 + 6^4 + 3^4 + 4^4
8208 = 8^4 + 2^4 + 0^4 + 8^4
9474 = 9^4 + 4^4 + 7^4 + 4^4

ただし, 1=1^4は含まないものとする. この数たちの和は 1634 + 8208 + 9474 = 19316 である.
各桁を5乗した数の和が元の数と一致するような数の総和を求めよ.

def hoge(num):
    # 最大値の算出
    d = 1 # 桁数
    while True:
        # 例えば 9^5*7=413343 であるため、9の5乗を7個足しても7桁には至らないことが分かる
        # このことから 9^5*6=354294 が問の条件に合致する可能性のある最大の値となる(たぶん)
        if d > len(str(9 ** num * d)):
            break
        d += 1
    max_number = 9 ** num * (d-1)
    # ジェネレータ関数を使ってみる
    def search():
        # 1=1^5は含めないので2^5(最小値)→最大値まで地道に全件走査
        for n in range(2**num, max_number+1):
            x = sum( int(m) ** num for m in str(n) )
            if n == x: yield x
    return sum(search())

print(hoge(5))

ジェネレータ関数の使い方あってますかね。