1

これが私のコードです:

primes = [2, 3]

while len(primes) != 1001:
    a = primes[-1] + 2
    for i in primes:
        if a % i == 0:
            break
    else:
        print(primes)
        primes.append(a)

print(primes[1002])

これは、1001 番目の素数までのリストを作成し、1001 番目の数を出力することになっています。まず、リストの最後の数値を取得して 2 を追加し、次に、指定された数値が素数リストのいずれかのメンバーで割り切れるかどうかをチェックします。割り切れる場合は、for ループが中断され、else 句がスキップされます。そうでない場合、数値は素数リストに追加されます。このプロセスは、リストの長さが 1001 になるまで繰り返されます。ループが終了すると、最後の番号が出力されます。

ただし、出力は次のようになります。

[2, 3]
[2, 3, 5]
_

また、プログラムは手動で終了するまで終了しません。私が間違っていることを教えてもらえますか?

4

3 に答える 3

5

これは、 がprimes[-1] + 2素数でない場合、状態が変更されないためです (そのため、プログラムは永久にループします)。

より良いアプローチは次のようなものかもしれません:

 from itertools import count

 primes = [2, 3]
 for a in count(5, step=2):
     for p in primes:
         if a % p == 0:
             break
     else:
         primes.append(a)
         if len(primes) > 1001:
             break
于 2013-04-14T01:25:55.353 に答える
1

a最初にヒットした非素数は、a成長を停止します。これは機能します:

primes = [2, 3]

a = 3
while len(primes) != 1001:
    a += 2
    for i in primes:
        if a % i == 0:
            break
    else:
        print(primes) # I'm not sure why you'd want to do this
        primes.append(a)

print(primes[1000]) # Note the index: 1000, not 1002
于 2013-04-14T01:34:37.957 に答える
0

まず、センチネル値に到達することを保証できない限り、while ループで == と != を使用しないように注意します。while len(primes) < 1000:たとえば。

同様に、ループの終了条件が最終的に到達することを確認する必要があります。

もう 1 つのオプションは、while True:をループ ヘッダーとして使用し、ループ内でブレークを使用して他の処理を行うことです。(if iteration_count > 1000000 or len(primes > 1000): break ... else iteration_count += 1たとえば)。

(あなたの例で素数リストに複数の値が追加されたバグを想像してみてください...コードの残りの部分が正しかったとしても、永久にループする可能性があります--数百万の素数の後で、プログラムはメモリ不足でクラッシュします)。

ループのelse:句は、Python に特有の機能です。他のほとんどのプログラミング言語では、センチネル変数を作成し、ループを抜けた後にその値をテストする必要があります。ループのelse:句は、何かを検索しようとする試みに固有のものであると考えてください。else:は、ループ内で適切なアイテムが見つからなかった場合に実行されるコードです。

ここであなたが本当に何をしようとしているのかわからないことを考えると。

于 2013-04-14T01:35:00.793 に答える