2012-06-28 88 views
2

我在執行「Eratosthenes篩選」時出現錯誤,以獲取指定範圍內的所有素數。我知道我的代碼還沒有素檢,我會在解決錯誤後添加它們。實施Eratosthenes篩選時的錯誤

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 
+0

有關使用'set'做一個篩子的示例:http://stackoverflow.com/a/9302299/5987 –

回答

2

你不能通過索引引用一個集合元素,但set是可迭代的,所以這個:

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

可以改寫爲:

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

+1。如果你因爲某種原因需要索引,你可以在「枚舉(池)」中做「。但值得指出的是,雖然這解決了他的錯誤,但它並沒有使他的算法發揮作用。正如BrenBam指出的那樣,一組中的元素是無序的,但OP似乎認爲他會首先獲得最小的素數。 – abarnert

2

錯誤正是它說:集不通過索引支持個別項目的檢索。它看起來像你想用一個列表或x範圍對象,而不是(例如,pool = xrange(l, r+1)。你爲什麼要使用一套?

注意,在集合中的元素是無序的,所以遍歷他們的方式你你不能假定更大的素數將在集合的「末尾」

+0

我使用了這個設置,這樣我就可以直接區分池中素數的倍數數字。 –