Another quick and easy solution. This doesn’t mean it’s an easy problem!; no, it’s more like playing a level at the rookie level. The hard and “correct” solution would be to work it out on pen-and-paper using Number Theory.
Statutory Warning: Spoilers ahead
digits :: Int -> [Int] digits n = digitsHelper n  where digitsHelper num dList = if num > 0 then digitsHelper (div num 10) $ (mod num 10) : dList else dList sumFifthPow :: Int -> Int sumFifthPow n = sum $ map (^ 5) $ digits n euler30 :: Int -> Int euler30 limit = sum $ [x | x <- [2 .. limit], x == sumFifthPow x]
Again, this version needs “manual intervention”, since I used the rough approximation that if
euler30 1000000 and
euler30 10000000 gave the same result, this was probably the right answer. It was.