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