2017-04-26 72 views
2
n = int(input("input n")) 
prime = [2] 
base = 3 
order = 0 

while base < n + 1: 
    if order < len(prime): 
     if base % prime[order] == 0: 
      order = len(prime) 
     else: 
      order += 1 
    else: 
     prime.append(base) 
    order = 0 
    base += 1 
print (prime) 

我想創建一個從1到給定數字'n'的素數列表。 (忽略數小於3的情況下)Python主要列表錯誤

我打算做的是:

  1. 帶來的第一個數字從3到n(我們稱之爲基礎)
  2. 在比較基礎,第一個數字首要列表(在這種情況下,2)
  3. 如果基數不可分,則將它與素數列表中的下一個數字進行比較。
  4. 重複步驟3,直到比較素數列表中的所有數字或者至少一個數字可以在素數列表中基數整除。
  5. 如果基數與素數列表中的所有數字相比並且不能被它們中的任何數字整除,則將基數追加到素數列表。
  6. 將基數值增加1,並重復步驟2至5直到base = n。

無論我爲n放什麼樣的價值,我只在打印的主要列表中獲得單值2。請幫助找出哪個部分是錯誤的。

+1

[Sieve Atkin在Python中的實現]可能的重複(http://stackoverflow.com/questions/21783160/sieve-of-atkin-implementation-in-python) –

回答

0

你的代碼失敗的原因是因爲你實際上並沒有正確檢查所有存儲的素數 - 你需要第二個循環。幸運的是,Python以兩種不同的方式讓你輕鬆實現:值的列表可以很容易地循環播放,並且for支持else。修改後的代碼應該是這個樣子:

n = int(input("input n")) 
prime = [2] 
base = 3 

while base < n + 1: 
    for p in prime: 
     if base % p == 0: 
      # base is NOT a prime, break out 
      break 
    else: 
     # loop ran to completion 
     prime.append(base) 
    base += 1 
print (prime) 

因此,而不是其他一些if聲明並不完全做你認爲它做的,我們改用for迴路校驗所有值在prime列表(分配到p),並按照您的預期進行分工。如果模數爲0,則循環不完整且else塊將不會運行,並且如果沒有素數導致0的模數,則將觸發else塊,將新發現的質數添加到列表中,依此類推。

例子:

$ python3 foo.py 
input n19 
[2, 3, 5, 7, 11, 13, 17, 19] 

如果你想保持現有的邏輯(即沒有for循環),可以在裏面做另一個while循環,記得以前它設置order0

+0

非常感謝你的詳細答案! –

+0

@KimKihyun不客氣。一般來說,像這樣的家庭作業類型的問題將被看作是否我們可以看到一個誠實的嘗試,所以保持良好的工作。 – metatoaster