Project Euler (Problem ID 6..10)

ID 8が難しかった…


ID 9は、ストレートに書くとスピードが足りなかったので、コードをいじっているうちに、なんだかごちゃごちゃした感じに。


問題固有のサブ関数は、whereで束ねた方が良いのかなぁ?

ID 6..10

import List

prog006 = sqrOfSum - sumOfSqr
	where
		sqrOfSum = sqr $ sum [1..100]
		sumOfSqr = sum $ map sqr [1..100]
		sqr n = n * n

prog007 = last $ take 10001 $ primes

prod5seq n = foldr (*) 1 [n..(n + 4)]

the1000digit = 7316717653133062491922511967442657474235534919493496983  -- 後略

prod5digit n = prod n 10000
	where
		prod n 1 = n
		prod n d = q * prod r (div d 10)
			where (q, r) = divMod n d

prog008 = foldl max 0 $ map prod5digit $ map read $ filter (\n -> length n == 5) $ map (take 5) $ tails $ show the1000digit

pythag n = [[a, b, c] |
	c <- [(div (4 * n) 10)..(div n 2)],
	b <- [((div (n - c) 2) + 1)..(c - 1)],
	a <- [n - (b + c)],
	a * a + b * b == c * c]

prog009 = map product $ pythag 1000

prime1414 n = and $ map (not . isMultiple n) $ primes1414
	where isMultiple n p = ((div n p) > 1) && ((mod n p) == 0)

prog010 = sum $ filter prime1414 [2..(2 * 1000 * 1000)]

primes1414 = takeWhile ((>) 1415) $ primes

main = putStrLn $ show $ prog010