65問目
http://projecteuler.net/index.php?section=problems&id=65
√2 の連分数展開を [1; 2,2,2, ...] と表記するとき、自然対数の底 e は [2; 1,2,1, 1,4,1, 1,6,1 , ... , 1,2k,1, ...] と表現できる。分数にすると 2, 3, 8/3, 11/4, 19/7, 87/32, 106/39, 193/71, 1264/465, 1457/536, ... となり、10番目の分数の分子の数字の和は 1+4+5+7=17 となる。同様に100番目の分数の分子の数字の和を求める。
最初に書いたコードはこれ。分子の漸化式を作って解いています。ふつーですね。
import Data.Char main = print $ euler065 100 euler065 :: Int -> Int euler065 n = sum $ map digitToInt $ show $ num !! n num :: [Integer] num = 1 : 2 : zipWith (+) num (tail $ zipWith (*) num exp') exp' :: [Integer] exp' = 2 : concat [[1, 2 * k, 1] | k <- [1..]]
で、フォーラムにあったコードがこれ。漸化式なんか作んなくたって計算させればいいじゃん、という考え方ですね。
foldrかぁ、かっこよすぎる。
import Data.Char import Data.Ratio main = print $ euler065 100 euler065 n = sum $ map digitToInt $ show $ numerator $ foldr1 (\ x y -> x + 1 / y) $ take n $ exp' exp' :: [Rational] exp' = 2 : concat [[1, 2 * k, 1] | k <- [1..]]