我不想从网上刮掉这个算法的 Ruby 版本,而是想根据这里的描述创建自己的。但是我无法弄清楚两件事
def primeSieve(n)
primes = Array.new
for i in 0..n-2
primes[i] = i+2
end
index = 0
while Math.sqrt(primes.last).ceil > primes[index]
(primes[index] ** 2).step(primes.length - 1, primes[index])
{|x| x % primes[index] == 0 ? primes.delete(x) : ""}
index += 1
end
primes
end
- 为什么它不迭代到数组的末尾?
- 根据上面链接中的描述,当数组中最后一个元素的平方根大于当前素数时,循环应该被打破——我之前做过这个。
我相当确定它与修改数组长度的删除操作有关。例如,当我输入 n=10 时,我的函数当前会产生 2,3,5,7,9,10,这显然是不正确的。关于如何改变它以使其按预期工作的任何建议?