2016-07-27 50 views
1

我想在Python中編寫腳本來找到第1000個素數。我不明白爲什麼這不起作用。基本上,當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

'count + = 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 

通過上述程序,第1000黃金可以成功地確定爲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 

將增加b,直到的next_odd平方根而沒有增加check。這意味着if check > 0:將不會通過,因此count永不增加,然後您只需旋轉 while count<=10:,跳過兩個if塊,因爲它們的條件是錯誤的。

換句話說,當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) 

幾個點這個代碼:

  • 有一個在全球範圍內沒有(非恆定)變量。這使得更容易推斷腳本的狀態隨時間變化。
  • 在while循環上使用for循環可以保證我們的腳本不會因爲錯誤的(或不確定的)條件而陷入無限循環。
  • for循環的使用意味着我們不必擔心自己增加所有變量,這大大減少了我們必須管理的狀態量。

希望有幫助!

哦,請注意,還有更有效的方法來計算素數。請參閱https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

+0

滴答是一個錯誤對不起!非常感謝,我看到我在那裏出錯了。 –