看板 Python 關於我們 聯絡資訊
大家好,我在寫計算 m~n 中有多少質數的程式 附上程式碼: import math def generatePrime(m,n): allNumber = range(m,n+1) primeTable = (2,3,5,7,11,13,17,19,23,29) index = 0 while index<len(allNumber): tempSqrt = math.sqrt(allNumber[index]) for eachPrime in primeTable: if tempSqrt < eachPrime: break if (allNumber[index] != eachPrime) and (allNumber[index] % eachPrime == 0): allNumber.remove(allNumber[index]) break index = index + 1 return allNumber 我是想先利用一個質數表來檢驗,如果這個數不再質數表上,但是對質數取餘數後為零 則代表他不是質數,那就把他從 allNumber 中剔除 但是我這樣寫,只能把 2 的倍數剔出耶… 檢查了幾次應該沒有問題才對阿QQ 所以想上來請教各位高手,是哪裡出錯了呢 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.4.201
Yshuan:我猜猜可能點 remove完當下 index指向下個(因為本來被刪除) 10/20 10:57
Yshuan:然後你又做index = index + 1 所以你allNumber有些被跳過了 10/20 10:58
kusoayan:我原本用 for 寫迴圈,可是 google 到好像會跳過一些值 10/20 11:23
kusoayan:所以才改用 while .. QQ 10/20 11:23
的確被猜中了,我把 allNumber.remove(allNumber[index]) 改成 allNumber[index] = 0 後 除了質數其他都變 0 了 .. 這樣我到底該怎麼剔除這些元素呢QQ ※ 編輯: kusoayan 來自: 140.112.4.201 (10/20 11:29)
rexkimta:用另外一個list來存質數,allnumber就存allnumber就好了 10/20 11:41
Yshuan:allNumber = [n for n in allNumber if isPrime(n)] 10/20 11:42
Yshuan:isPrime(n) 回傳boolean來判斷 10/20 11:43
kilfu0701:f_allNumber = filter(lambda a: a != 0, allNumber) 10/20 11:47
kdjf:把東西從list拿掉會動到後面的每一個東西,不太好吧 10/20 20:10
kusoayan:目前是採用Ys大的 filter 方法 QQ 10/20 22:02
kusoayan:暫時運作正常 不過這樣對效能影響大嗎? 10/20 22:02