2016-07-27 8 views
1

私は1000番目の素数を見つけるためにPythonでスクリプトを書こうとしています。私はなぜこれがここで働いていないのか分かりません。基本的には、modが数の平方根よりも小さく、残りの部分が残っている間に、modは1だけ上がります。これは、modが数値の平方根に等しくなるまで続きます。その後、チェックは0のままで、番号はプライムでなければなりません。私がスクリプトを実行しようとするたびに、それは私にシステムエラーを教えてくれます。1000番目の素数を見つけようとしています

import math 
b=2 
count=2 
next_odd=3 
next_prime=1 
check = 0 

while count<=10: 
    while b<float(math.sqrt(next_odd)): 
     if next_odd%b>0: 
       b+=1 
     if next_odd%b == 0: 
       check+=1 
    if check > 0: 
     next_prime=next_odd 
     next_odd+=2 
     print(next_prime) 
     b=2 
     count+=1` 
+1

「カウント+ = 1」の直後に '\'があります – Elazar

+1

「システムエラー」とは何ですか? –

+1

私の推測はSyntaxErrorです – Elazar

答えて

2

私はあなたが何をしようとしているのか理解していますが、あなたのプログラムには多すぎるものがありました。ここには働くバージョンがあります。私は最小限の変更を加えました。うまくいけば、以下のバージョンを自分のものと比較して、どこが間違っているのかを見ることができます。上記のプログラムでは

import math 

count=2 
next_odd=3 
next_prime=1 

while count<=1000: 
    b=1 
    check = 0 
    while b<float(math.sqrt(next_odd)): 
     b+=1 
     if next_odd%b == 0: 
      check+=1 
    if check == 0: 
     next_prime=next_odd 
     print(next_prime) 
     count+=1 
    next_odd+=2 

、第千首相は7919.

2

であることが成功裏に決定することができる(第一、私は、あなたのコードの末尾にダニがあなたのスタックオーバーフローのポストのタイプミスではないと仮定コード自体)

next_oddが素数である場合を考えてみましょう。このブロック:

while b<float(math.sqrt(next_odd)): 
    if next_odd%b>0: 
      b+=1 
    if next_odd%b == 0: 
      check+=1 

は、これまでcheckをインクリメントせずnext_oddの平方根までbをインクリメントします。つまり、if check > 0:は通過しません。したがって、countは決して増分しません。 while count<=10:で回り、ifブロックをスキップします。その条件はfalseです。

つまり、実際にnext_oddが素数であるときに何をするかは言いません。これはまた、whileが本当に使用されるべきでない理由の例でもあります。あなたがしたいのは数字を使ってインクリメントするだけです(ここではこれを使っています)。

max_num = 10000 # or whatever 
for odd in range(3, max_num, 2): 
    factor_count = 0 
    for factor in range(2, math.floor(math.sqrt(max_num)) + 1): 
     if odd % factor == 0: 
      factor_count += 1 
    if factor_count == 0: 
     print(odd) 

このコードについてのカップルのポイント:

  • グローバルスコープには(非定数)の変数がありません。このような何かを試してみてください。これにより、スクリプトの状態が時間とともにどのように変化するかについて、より簡単に判断することができます。
  • for-loops over whileループを使用すると、誤った(または説明されていない)条件のためにスクリプトが無限ループで捕捉されないことが保証されます。
  • for-loopsを使用すると、すべての変数を自分自身で増やすことを心配する必要がなくなり、管理しなければならない状態の量が劇的に減少します。

希望に役立ちます!

ああ、素数を計算する方法はずっと効率的です。 https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

+0

チックは間違いでした申し訳ありません!ありがとう、私はどこに間違っていたのか分かります。 –

関連する問題