【发布时间】:2016-08-31 12:17:37
【问题描述】:
我有以下代码,其中eratosthenes(N) 返回一个从 1 到 N 的素数数组。我想要做的是从此列表中删除包含数字 0、2、4、5、6、8 的所有数字。我的代码似乎非常低效和错误,因为它需要大约 20 秒(eratosthenes(N) 是瞬时的)才能达到 100,000 并且不会删除我想要的所有数字。有没有更好的、可扩展的解决方案来解决这个问题?
N = 1_000_000
primes = eratosthenes(N)
primes.each do |num|
if ["0", "2", "4", "5", "6", "8"].any? { |digit| num.to_s.include?(digit) }
primes.delete(num)
end
end
【问题讨论】:
-
"包含数字 0、2、4、5、6、8" - 我很确定这是高效 Eratosthenes 筛子的错误方法。您想跳过其 最后一个 数字是其中之一的数字,不是吗?
-
另外,不要改变您当前正在迭代的数组。这应该解释“不会删除我想要的所有数字”
-
我删除 0、2、4、5、6、8 的原因与我最初搜索素数的原因是分开的。我已经有了我的素数数组,我想进一步剔除它。第二点已适当注明。
标签: ruby performance scalability