编写一个名为isPrime的函数,用于确定整数是否为素数(均匀 只能由它自己和一个整除。作为参考,这里是小于100的素数列表: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97 ] 什么是第1000到第1020个素数? (从2开始)
isPrime :: [Integer]
isPrime = sieve [2..1020]
where
sieve (p:xs)
| p*p <= 1020 = p : sieve [x|x <- xs, x `mod` p > 0]
| otherwise = (p:xs)
我尝试了这段代码,但它会打印素数2到1020。 我希望从2开始显示1000到1020
答案 0 :(得分:1)
不是生成高达1020的素数,而是发出第1000到第1020个素数,你可以生成前1020个素数并仅发出最后的21个素数。
使用a naive unbounded sieve,我们可以编写以下内容
(dataBlob, sectionIDs, rowIDs)
然后找minus :: Ord a => [a] -> [a] -> [a]
minus (x:xs) (y:ys) = case (compare x y) of
LT -> x : minus xs (y:ys)
EQ -> minus xs ys
GT -> minus (x:xs) ys
minus xs _ = xs
primes :: [Integer]
primes = eratos [2..]
where
eratos [] = []
eratos (p:xs) = p : eratos (xs `minus` [p, p+p..])
primesFromTo from to = drop (from-1) $ take to primes
:
primesFromTo 1000 1020
顺便说一下,命名(*Main> primesFromTo 1000 1020
[7919,7927,7933,7937,7949,7951,7963,7993,8009,8011,8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111]
)对于素数列表有点疑问......