2016-05-02 8 views
2

私はすべての素数のリストを特定の数に戻そうとしています(これはProject Euler問題7の場合です)。私はPythonにとって非常に新しいですが、私の問題は言語ではないようですが、論理エラーです。私のコードはどこにありますか[初心者のPython]

import math 
import sys 

def is_prime(n): 
    if n%2 == 0: 
     return False 
    for i in range(3, int(math.sqrt(n))+1, 2): 
     if n%i == 0: 
      return False 
    return True 

def prime_counter(n): 
    result = [2] 
    while len(result) < n: 
     for i in range(3, sys.maxsize, 2): 
      if is_prime(i): 
       result.append(i) 
       break 
    return result 

print (prime_counter(6)) 

[2、3、3、3、3]が表示されます。なぜiを増やしてリストの新しい数字を評価しないのですか?なぜ3を続けているのですか?

+0

あなたは決して 'i'をインクリメントせず、あなたは' for'ループを壊します。あなたはどこかにカウンタを追加するべきです – Till

答えて

1

それぞれが新しくプライム発見resultの長さをテストし、代わりに、whileループを取り除くと:

def prime_counter(n): 
    result = [2] 
    for i in range(3, sys.maxsize, 2): 
     if is_prime(i): 
      result.append(i) 
      if len(result) == n: return result 
+0

@BillLynch - 編集に感謝します。私はちょうどそれに気づいていたが、私はできるだけ早くそれを修正した。 –

3

あなたbreak文が機能prime_counterで、それは最初の素数を見つけるたびに、あなたのforループを抜けます(3)。次に、最初からforループを再起動します。番号3から開始し、再び検出されます。これは素数です。

たとえば、whileループを1つ使用し、候補変数を自分自身で増やしてから、十分な素数を見つけたらループを解除する必要があります。

0

あなたのbreak文が問題のようです。 forループの最初のサイクルでは、i = 3に設定し、iがsys.maxsizeより小さいことを確認して、iがプライムであるかどうかを確認します。それで、私たちはifステートメントの本文を行います。結果セットにiを追加して、forループから抜け出します。 forループの先頭に戻ったことはないことに注意してください。私は2をインクリメントします。私は3を残しました。forループを抜けた後、while文の条件をチェックし、結果セットはnよりも小さいので、私は3を開始し、3がsys.maxsizeよりも小さいかどうかをチェックして、forループを繰り返し始めます。あなたはiを増やすことは決してありません。

ダブルループではなく、代わりにforループを使用して、追加が成功するたびに、結果セットの新しい長さがnに等しいかどうかを確認し、そうであれば、ループ。 whileループを完全に取り除く。

幸運を祈る!

関連する問題