2010-06-12 67 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