Project Euler Problem 3
http://projecteuler.net/index.php?section=problems&id=3
600851475143の素因数のうち最大のもの
main = print $ last $ primeFactors 600851475143 2 primeFactors :: Integer -> Integer -> [Integer] primeFactors x y | x > y = if (x `mod` y == 0) then [y] ++ (primeFactors (floor $ (fromIntegral x) / (fromIntegral y)) $ nextPrime y) else [] ++ (primeFactors x $ nextPrime y) | otherwise = [y] nextPrime :: Integer -> Integer nextPrime n = head $ filter (\n -> isPrime n) [n+1..] isPrime :: Integer -> Bool isPrime 1 = False isPrime n = null [x | x <- [2..n-1], n `mod` x == 0]
参考:http://www.shido.info/hs/haskell4.html#int
もっと素直で短い解答:http://d.hatena.ne.jp/rst76/20080314/1205500266
/しか思いつかんかった俺のバカ
(2009/05/23追記)
たまたま答えは合ってただけでprimeFactors間違ってた
main = print $ last $ primeFactors 2 600851475143 primeFactors :: Integer -> Integer -> [Integer] primeFactors x y | y > x = if (y `mod` x == 0) then [x] ++ (primeFactors (nextPrime x) $ (continueToDiv y x)) else [] ++ (primeFactors (nextPrime x) y) | otherwise = if y == 1 then [] else [y] --割り切れなくなるまで割る continueToDiv :: Integer -> Integer -> Integer continueToDiv a b = if (a `mod` b) == 0 then continueToDiv (a `div` b) b else a
(2009/05/26追記)
更に修正->Project Euler Problem 7 - souta-bot log