2014-12-05 71 views
1

我對Python相當陌生,並且試圖通過執行Project Euler問題來練習編程。爲了解決7th problem,我決定首先使用for循環來構建一個簡單的主要生成函數,這似乎不起作用。python中的素數生成器返回多個複合物而不是質數

這裏是我的代碼:

primes = [2] 

for n in range(2, 10): 
    for m in range(2, n): 
     if not(n % m): 
      primes.append(n) 

print primes 

輸出是[2,4,6,6,8,8,9]什麼,而不是我的本意,即[2,3,5,7]。數學似乎對我來說是正確的:選擇一個自然數,n,大於2。對於大於1但小於n的所有自然數m,檢查n是否可以被m整除。如果不是,則在素數列表中加n。任何人都可以告訴我我的代碼有什麼問題嗎?

P.S.雖然我知道還有其他幾種(更好的)產生素數的方法,但我有興趣使我的方法(代碼)有效。

回答

3

not(n % m)告訴你,如果一個數字是不是素數。

您還需要爲每個候選因素做這件事,然後才知道數字是否爲素數。

Python在for: else:中有一個非常方便的機制,如果你沒有中斷for,它只會運行else塊。

primes = [] 
for n in range(2, 10): 
    for m in range(2, n): 
     if not(n % m): 
      break 
    else: 
     primes.append(n) 

您可以用生成器表達式類似的方式測試素性:

prime = not(any(n % m == 0 for m in range(2, n))) 

記住range是在Python 2.x的效率不高,因爲它開始迭代之前生成編號的完整列表。使用xrange,除非你使用Python 3.x

+0

優秀的答案!謝謝你的幫助。 – chubbycantorset 2014-12-05 07:55:57

+0

根據您的建議,我添加了break和else語句,並將[2,3,5,5,7,7,7,7,7,9]作爲輸出。你知道爲什麼它會多次返回5和7嗎? – chubbycantorset 2014-12-05 07:59:02

+0

你把其他東西放在錯誤的深度嗎?這不是我運行我提交的確切代碼時得到的輸出。 – lunixbochs 2014-12-05 08:01:34

相關問題