50問目
http://projecteuler.net/index.php?section=problems&id=50
41 = 2 + 3 + 5 + 7 + 11 + 13は6つの連続する素数の和として表現できる。百万未満の素数で、最も長く連続する素数の和となるものを求める。
連続する素数の和が百万未満で、長さが最も長くなるときを求め、そこから一つずつ長さを減らしながら和が素数となる場合があるかを調べています。
import Data.List main = print $ euler050 1000000 euler050 :: Int -> Int euler050 max = head $ concatMap (sums max) $ [maxLen,maxLen-1..1] where maxLen = length $ takeWhile (< max) $ scanl1 (+) primes sums :: Int -> Int -> [Int] sums max n = filter isPrime $ takeWhile (< max) $ map (sum . take n) $ tails primes isPrime :: Int -> Bool isPrime x = all ((/= 0) . mod x) $ takeWhile (<= (floor $ sqrt $ fromIntegral x)) primes primes :: [Int] primes = 2 : filter isPrime [3..]