是的,我知道Eratosthenes的筛子在标准库的Prime类中,但我正在尝试实现自己的一个练习。
我在逐字逐句地遵循维基百科上的描述:
要通过Eratosthenes的方法找到所有小于或等于给定整数N的素数:
一创建从2到n的连续整数列表:(2、3、4、…、n)。
2最初,让p等于2,第一个质数。
三。从p开始,以p为增量计数到n,枚举其倍数,并将其标记在列表中(这些将是2p,3p,4p,…;不应标记p本身)。
四。在未标记的列表中查找大于p的第一个数字如果没有这样的号码,停下来否则,让p等于这个新数(这是下一个素数),然后从步骤3开始重复。
5个。当算法终止时,列表中所有未标记的数字都是质数。
def sieve(n)
# Create a list of consecutive integers from 2 through n.
list = [*2..n] # [2, 3, 4, 5, etc]
p = 2 # Let p equal 2, the first prime number
# Starting from p, enumerate its multiples by counting to n in in increments of p
loop do
p1 = p # We'll use this to count in increments, by adding the initial value of p to p each iteration
until p >= n
p += p1
list.delete(p) # Mark all multiples of p in the list
end
if list.find{|x| x > p}
p = list.find{|x| x > p} # p now equals the first number greater than p in the list that is not marked (deleted)
else
return list
end
end
end
但是
sieve(20)
的输出是[2, 3, 5, 7, 9, 11, 13, 15, 17, 19]
,显然它只是2乘2的计数。我不知道为什么。
最佳答案
你正在改变p,所以在list.find{|x| x > p}
中不是2也许您想将这部分代码更改为list.find{|x| x > p1}
。