3
m = range(1, 2000000, 2)
sum1 = 2
for x in xrange(1, 2000000, 2):
    for y in m:
        if x != y:
            if x%y == 0:
                m.remove(x)
            if all(x%y != 0):
                sum1 += x

それが私が書いたものです。200 万以下のすべての素数を追加しようとする問題です。私の問題は all() ステートメントにあります。私がやりたいことは、x が素数かどうかを確認することです。これは、すべての x%y が剰余を与える場合にのみ真です。

また、ステートメント (break?) を使用して、y > x/3 の場合にループを停止できます。

 m = range(1, 2000000, 2)
sum1 = 2
for x in xrange(1, 2000000, 2):
    for y in m:
        if y > x/3:
            break
        else:
            if x != y:
                if x%y == 0:
                    m.remove(x)
                if all(x%y != 0):
                    sum1 += x
4

3 に答える 3

9

sequence または iterable を渡す必要がありallます。これは、渡されたすべての項目が true と評価されるかどうかをテストするだけです。正しい使用方法は次のallとおりです。

>>> all([True, True, True])
True
>>> all([True, False, True])
False
>>> all([x > 5 for x in range(10)])
False
>>> all([x > 5 for x in range(6, 10)])
True
>>> all(x > 5 for x in range(6, 10))
True

ショートサーキットを利用しているので、最後の 1 つが最適です。

ただし、allコード内での呼び出しは無意味です。あなたのコードの背後にあるアイデアは、すべての値mを調べて、2 から 2000000 までの任意の数で割り切れる値を削除することです。それが完了すると、m素数のみが含まれます。

もちろん、 を削除してもコードは機能しませんallmこれは、 の各数値が数値で割り切れるかどうかを実際にテストしているためです[1, 3, 5, 7...1999999]。(これが で示される数列xrange(1, 2000000, 2)です。 で始まり1、すべてが で割り切れる1ので、コードは何も素数としてカウントしません。そして、1その数列から取り除けば、 で割り切れるもの2はコードで素数としてカウントされます!内部ループで実際にテストする必要がある数値について、より慎重に検討してください。

最後に、このコードが完了するループの数を考慮する必要があります。これが機能しても、結果が生成されるまでには非常に長い時間がかかります。最初に小さい数値でテストする必要があります。そして、ループ回数を減らす方法を考えるべきです。(そして少し考えてから、これを読んでください。)

しかし、これが機能したらsum、あとは素数のリストを呼び出すだけです。

于 2012-05-27T12:00:59.200 に答える
1

の使用allは正しくありません。ドキュメントを見ると、イテラブルが必要です。

あなたがやろうとしているのは、次の形式のジェネレーター式を使用することです。

sum(x**2 for x in range(10))

これはリスト内包表記と非常によく似ています

[x**2 for x in range(10)]

ただし、allこの方法で を使用しても、除数が見つかった場合にジェネレータ式が突然停止することはありません。の使用anyとチェックはx == 0すぐに停止しますが、コードが現在フォーマットされているため、素数と見なす前に多くの約数をチェックします。

これはより適切です:

primes = []
MAX = 2000000

number = 2
while number < MAX:
    for prime in primes:
        if number % prime == 0:
            number += 1
            continue

    primes.append(number)
    number += 1

total = sum(primes)
于 2012-05-27T12:16:50.287 に答える
0

all() takes an iterable for an argument. In your situation, you would use it like this:

all(x%y for y in m)

where x%y for y in m is a generator expression. If I have an iterable

[item1, item2, item3, item4...]

all(iterable) is equivalent to:

item1 and item2 and item3 and item4...'
于 2012-05-27T12:07:04.240 に答える