Life Goes On

まあまあだけど楽しんでる方です

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]