2013-07-24 88 views
1

我想要做的是:素數生成器不工作的Python

  • 創建奇數的「名單」
  • 然後測試它們是否素 測試將用倍數來完成多達奇數的值的一半,因此halfodd
  • 把質數到列表
  • 打印,列出

豪ver我的結果是從1到1003跳過3,4和5的數字列表

這裏是否存在語義錯誤?

#Prime number generator 

def primenumber(): 
    primelist = [1, 2] 
    num = 3 
    even = num%2 
    multi = 0 
    result = 0 
    while len(primelist) < 1000: 
     if even != 0: 
      oddnum = num 
     i = 2 
     halfodd = ((oddnum + 1)/2) 
     while i < halfodd: 
      i =+ 1 
      multi = oddnum%i 
      if multi == 0: 
       result += 1 
     if result != 0: 
      primelist.append(oddnum) 
      prime_num = oddnum 
     num += 1 
    print primelist 

primenumber() 
+0

我不確定這是否是問題的根源,但是您從不重新計算偶數,因此它不會幫助您清除稍後在代碼中測試的偶數。 – Blckknght

+1

您上傳的代碼有問題。我甚至無法得到輸出......如果我將素數的數量改爲5,那麼程序不會終止。 –

+2

您可以實施[Eratosthenes的篩選器](http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes),只是單挑。 – 2rs2ts

回答

0
if result != 0: 

由於result是(應該是)你發現了多少因素的計數,你想

if result == 0: 

你也不能復位result當你進入到一個新的候選素數,你永遠不會重新計算even,如果你這樣做,你會考慮奇數兩次。

0

這應該工作:

def primenumber(): 
    primelist = [1, 2] 
    candidate = 3 
    while len(primelist) < 1000: 
    isCandidatePrime = True 
    if (candidate % 2 == 0): # if candidate is even, not a prime 
     isCandidatePrime = False 
    else: 
     for i in range(3, (candidate+1)/2, 2): # else check odds up to 1/2 candidate 
     if (candidate % i == 0): # if i divides it, not a prime 
      isCandidatePrime = False 
      break 
    if (isCandidatePrime): 
     primelist.append(candidate) 
    candidate += 1 
    print primelist 

我覺得有幾個改進(只檢查數量小於或等於候選的平方根,只檢查素數,不是所有的數字比平方根少的候選人),但現在我會一個人離開。