4問目
昨日はチビが夜更かししたせいでUPできなかったので、2問まとめて。
まず4問目。
http://projecteuler.net/index.php?section=problems&id=4
999以下の2数の積で、回文になるような最大の数を求めろというもの。
以下のように順番に試して、回文になったものを返します。
999と999→998001
999と998→997002
998と998→996004
999と997→996003
998と997→995006
999と996→995004
main = print $ euler004 1998 999 euler004 :: Integer -> Integer -> Integer euler004 a b | isPalindrome(b * (a - b)) = b * (a - b) | (b == 999) = euler004 (a - 1) (div a 2) | otherwise = euler004 a (b + 1) isPalindrome :: Integer -> Bool isPalindrome i = (show i) == (reverse $ show i)
追記:
つうか、たまたま答えが求められただけで、これじゃ駄目だろ。修正版
import Data.List euler004 :: Integer euler004 = foldl phi 0 [999,998..100] phi :: Integer -> Integer -> Integer phi m n = case find isPalindrome $ takeWhile (>m) $ map (n*) [n,n-1..100] of Nothing -> m Just p -> p isPalindrome :: Integer -> Bool isPalindrome i = show i == reverse (show i)