2

「エラトステネスのふるい」を実装して、指定された範囲内のすべての素数を取得するときにエラーが発生します。私のコードにはまだ素数性チェックがないことを知っています。エラーを解決したら、それらを追加します。

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
4

2 に答える 2

2

エラーはまさにその通りです。セットは、インデックス作成による個々のアイテムの取得をサポートしていません。代わりにリストまたはxrangeオブジェクトを使用したいようです(たとえば、pool = xrange(l, r+1)なぜセットを使用したのですか?

セット内の要素は順序付けられていないため、実行しようとしている方法で要素を反復処理しても機能しないことに注意してください。大きな素数がセットの「終わり」にあると想定することはできません。

于 2012-06-28T04:21:31.120 に答える
2

インデックスでset要素を参照することはできませんが、asetは反復可能であるため、次のようになります。

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

次のように書き直すことができます。

for el in pool:
   if prime >= el:
       prime = el
       break
于 2012-06-28T04:34:15.090 に答える