是的,我知道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}

10-06 07:15