2013-11-14 70 views
2
n=5;count=2;i=3;j=2; 
while (count <= n): 
    for j in range (2,i): 
      if(i%j == 0):   
       break 
    if(j==i): 
     print i 
     count = count +1 
    i = i+1 

我想找到前n個素數,但不知怎的,這段代碼似乎沒有編譯。 該程序卡在for循環。 我曾嘗試使用編寫代碼在C使用相同的邏輯,它似乎工作正常,但因爲我需要大量支持python似乎是一個明顯的選擇,因此希望在python中運行。 任何幫助將是偉大的。無法找到蟒蛇中素數代碼中的錯誤

+3

縮進在Python顯著 - 應該從字面上的*第一*您瞭解語言的東西。 –

+0

使用有意義的變量名將使您的代碼更易於閱讀和理解 – hankd

+0

風格nit:擺脫'while'和'if'語句中的括號。括號是明顯的C-ISM。 –

回答

6

range(a, b)a變爲b-1

n=5;count=2;i=3;j=2; 
while (count <= n): 
    for j in range (2,i): 
     if(i%j == 0):   
      break 
    if(j==i-1): 
     print i 
     count = count +1 
    i = i+1 

我打賭你有

int j; 
for(j = 2; j < i; j++) { 
} 

所以由環的素數的結束,ji。當使用range時,Python不會超過限制。

+0

好抓,需要調整檢查,不在範圍內 – CDspace

+1

+1優秀。但是,請注意,如果您在此使用'else:',則完全取消檢查。這避免了[DRYer](http://en.wikipedia.org/wiki/Don't_repeat_yourself)代碼重複'i'和'j'之間的關係。 –

+0

而不是改變if語句我改變了for循環條件和程序運行得很好。感謝您的幫助 –

0

你的問題就在這裏:

for j in range (2,i): 

這將檢查J = 2,3,4 .... I-1。因此,你的代碼在這裏永遠不會運行:

if(j==i): 
     print i 
     count = count +1 

所以計數永遠不會改變。因此你得到一個無限的while循環。改變你的支票

if(j==i-1): 
     print i 
     count = count +1 
+1

'range(2,i + 1)'不會產生素數,因爲'i'總是將'i'分開。 –

+0

好點!編輯 – hankd

+0

@PaulDraper錯誤。 'range(2,i + 1)'將起作用,因爲'break'將總是爲'prime =='發射,但是這並不重要,因爲if(j == i):'成功了。如果有'else:',那麼這將不起作用,但那裏沒有'else:',那裏有一個測試。此外,[OP說](http://stackoverflow.com/questions/19982323/unable-to-find-the-mistake-in-prime-number-code-in-python/19982428#comment29748862_19982428)他們「改變了爲循環條件和程序運行得很好。「。 –

0

在Python 3,這是print(),不print。代碼編譯時,你改變這一行:

 print(i) 

你似乎也有一個無限循環,但我會讓你調試。

+1

唉......也許他在用Python 2.因爲他沒有提到這是一個問題。 –

+0

是的,但他做了Python 3的標記,並且這是在Python 3中唯一的編譯錯誤(這是他聲稱的問題所在)。 –

1

這是一個很好的用於在循環之後關鍵字else:的其他模糊語法。正如其他人所評論的,您成功完成for循環的測試已關閉。

相反,嘗試用else測試成功完成:

for j in range (2,i): 
     if(i%j == 0): 
      break 
else: 
    print i 
    count = count +1 
+0

如果Python有什麼明顯的不同,它*是* for。 。其他情況。它實際上*對你喊:「Python」;令人難以忘懷的一次。所以,「模糊」並不是我對它的感受。 :)(只是一個旁註):) –