9問目
http://projecteuler.net/index.php?section=problems&id=9
a^2 + b^2 = c^2, a + b + c = 1000, a < b < c を満たす自然数を求める。
(250,251,499) → (249,252,499) → .. → (3,498,499)
→ (249,251,498) → ..
と順に調べていきます。
main = print $ euler009 250 251 499 euler009 :: Int -> Int -> Int -> Int euler009 a b c | ((a^2) + (b^2) == (c^2)) = a * b * c | (b < c) = euler009 (a-1) (b+1) c | otherwise = euler009 (1000 - (div c 2) - (c-1)) (div c 2) (c-1)
上のプログラムは我流な感じなので、もう少しHaskellっぽい書き方でも。
もっと素直なアルゴリズムの方がよかったですね。
main = print $ euler009 1000 euler009 :: Int -> Int euler009 n = head $ [(n-b-c)*b*c | c <- [(div n 3)..(div n 2)], b <- [(div (n-c) 2)+1..(c-1)], (n-b-c)^2 + b^2 == c^2]