2010-06-12 39 views
0

我不明白爲什麼這不起作用。請幫我查找質數的第n個

from math import sqrt 

pN = 0 
numPrimes = 0 
num = 1 

def checkPrime(x): 
    '''Check\'s whether a number is a prime or not''' 
    prime = True 
    if(x==2): 
     prime = True 
    elif(x%2==0): 
     prime=False 
    else: 
     root=int(sqrt(x)) 
     for i in range(3,root,2): 
     if(x%i==0): 
      prime=False 
      break 
    return prime 

n = int(input("Find n number of primes. N being:")) 

while(numPrimes != n): 
    if( checkPrime(num) == True): 
     numPrimes += 1 
     pN = num 
     print("{0}: {1}".format(numPrimes,pN)) 
    num += 1 

print("Prime {0} is: {1}".format(n,pN)) 
+3

您認爲該計劃需要做什麼?它做了什麼? – Guru 2010-06-12 21:58:04

回答

5

您需要更改

root=int(sqrt(x)) 

root=int(sqrt(x))+1 

(以9例如,int(sqrt(9))3和​​是[],你真的想要測試除以3!)。

從技術上講,1也不是主要的。添加

if(x<=1): 
    prime = False 

,你會得到相同的結果http://www.rsok.com/~jrm/first100primes.html

+0

很好的答案。只需修改條件爲:if(x <= 1) – AraK 2010-06-12 22:39:22

+0

好點:)。 – aioobe 2010-06-12 22:42:40

+0

工作完美!謝謝 – Sonryell 2010-06-13 03:25:30

1

不同於什麼@Braxton說,在評論,埃拉托色尼算法的篩可以很容易地適應,產生無限的素數(例如,作爲一個潛在的 - 無限長髮電機,然後可根據需要縮減,例如itertools.slict)。

爲無界篩在Python參見this recipe(並確保應用中的註釋示出的改進,包括礦;-)或看到相同的配方作爲最後編輯用於打印的食譜here(不幸的討論部分被縮減在這本谷歌圖書中,但至少解決方案的代碼都在那裏;-)。

+0

謝謝!我顯然有很多東西要學,但是這非常有幫助 – Sonryell 2010-06-13 05:23:47

+0

@Braxton,不客氣! – 2010-06-13 13:51:11