Project Euler – 問題30

驚くことに各桁の数の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^4=1は和ではないのとで含めない。

これらの数の和は1634+8208+9474=19316となる。

各桁の数の5乗の和が自分自身になるような数の和を求めよ。

条件を満たす数がn桁としたとき、それぞれの桁の数の5乗の和というのは最大 で9^5*nなので、9^5*nがn桁になる必要がある。すると条件を満たす数は最大で も6桁、しかも9^5*6以下ということがわかるので、ここでは2から300000の数の リストについてfilterで判定を行いsumを用いて和を求めることにする。

各桁の5乗の和が元の数に等しいかをチェックするローカル関数fpは以下のよう に定義をそのままプログラムにしたものとする。ソースコード的美しさにはか けるが一応答えは求まる。

euler030 = sum $ filter fp [2..300000]
    where fp n = let n1 = n `mod` 10
                     n2 = (n `mod` 100) `div` 10
                     n3 = (n `mod` 1000) `div` 100
                     n4 = (n `mod` 10000) `div` 1000
                     n5 = (n `mod` 100000) `div` 10000
                     n6 = (n `mod` 1000000) `div` 100000
                 in n1 ^ 5 + n2 ^ 5 + n3 ^ 5 + n4 ^ 5 + n5 ^ 5 + n6 ^5 == n