【问题标题】:Error in implementing Sieve of Eratosthenes实施埃拉托色尼筛法的错误
【发布时间】:2023-03-20 01:07:01
【问题描述】:

我在实施“埃拉托色尼筛法”以获取指定范围内的所有素数时出错。我知道我的代码还没有进行素数检查,我会在解决错误后添加它们。

def foo(l,r):
    if l == r:
        return "Error"
    if l > r:
        return "Error"
    if l < r:
        pool = set(xrange(l,r + 1))
        prime = 2
        if l == 1:
            print "Discard 1 for now"
        while prime <= r:
            rem = set(xrange(prime,r + 1,prime))
            pool.difference_update(rem)
            a = 0

            while prime >= pool[a]:
                a = a + 1
            prime = pool[a]
        print pool

foo(1,31623)

错误:

Traceback (most recent call last):
  File "D:\code\sieve_of_eratothenes.py", line 32, in <module>
    foo(1,31623)
  File "D:\code\sieve_of_eratothenes.py", line 27, in foo
    while prime >= pool[a]:
TypeError: 'set' object does not support indexing

【问题讨论】:

标签: python


【解决方案1】:

您不能通过索引引用集合元素,但是 set 是可迭代的,因此:

a = 0
while prime >= pool[a]:
   a = a + 1
   prime = pool[a]

可以改写为:

for el in pool:
   if prime >= el:
       prime = el
       break

【讨论】:

  • +1。如果出于某种原因需要索引,则可以执行“for a, el in enumerate(pool)”。但值得指出的是,虽然这解决了他的错误,但并没有使他的算法工作。正如 BrenBam 指出的那样,集合的元素是无序的,但 OP 似乎认为他会首先得到最小的素数。
【解决方案2】:

错误就是它所说的:集合不支持通过索引检索单个项目。您似乎想改用列表或 xrange 对象(例如,pool = xrange(l, r+1)。为什么要使用集合?

请注意,集合中的元素是无序的,因此以您尝试的方式迭代它们是行不通的。你不能假设更大的素数会在集合的“末端”。

【讨论】:

  • 我使用了这个集合,这样我就可以直接从数字池中区分出素数的倍数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多