欧拉计划中的问题 10。我在那里看到了一些讨论,但仅限于 C。
我用下面的代码来计算:
print . sum . sieve $ [2..2000000] where
sieve [] = []
sieve (x:xs) = x : sieve (filter ((/= 0) . (`mod` x)) xs)
需要很多年的时间来计算。我想知道是否有更有效的计算方法?
在 haskell 中描述了许多非常快速的计算素数的方法haskellwiki 素数页面 http://www.haskell.org/haskellwiki/Prime_numbers。具体来说,第二个似乎足够好,所以你可以这样写:
main = print . sum . takeWhile (< 2000000) $ primes
primes = 2: 3: sieve (tail primes) [5,7..]
sieve (p:ps) xs = h ++ sieve ps [x | x <- t, rem x p /= 0]
where (h,~(_:t)) = span (< p*p) xs
运行它我们得到:
ghc --make -O2 Euler10.hs
time ./SOAns
142913828922
real 0m1.598s
user 0m1.577s
sys 0m0.017s
wiki 描述了为什么你的解决方案这么慢,主要原因是为每个数字设置了一个筛子,最多 2000000,而每个素数一个就足够了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)