HappyNumberの判定

30分プログラム、その618。C++の宿題/HappyNumber - C/C++の宿題を片付けます@wiki - アットウィキにインスパイアされてHappyNumberの判定をやってみる。

正整数a以上b以下のHappyNumberを求めるプログラムを作成せよ。
ただし、関数を使うこと。
HappyNumberとは、正整数nの各桁の数を2乗し、その合計を求め、その合計の各桁の数を2乗し、またその合計を求める計算を繰り返したとき、最終的に1となる正整数nのことをいう。

1か4に収束するらしいよ。

使い方

*Main> isHappyNumber 226
False
*Main> isHappyNumber 226
True

ソースコード

import Data.List

splitInt :: Int -> [Int]
splitInt = unfoldr (\n -> if n == 0 then Nothing
                          else Just (n `mod` 10, n `div` 10))

isHappyNumber n = let m = sum $ map (\x -> x * x) $ splitInt n
                  in if m == 1 then True
                     else if m == 4 then False
                          else isHappyNumber m