寻找第 n 个素数
Posted
技术标签:
【中文标题】寻找第 n 个素数【英文标题】:Finding the nth Prime 【发布时间】:2014-05-28 14:41:45 【问题描述】:我正在尝试创建一个输出第 n 个素数的算法。我已经编写了代码,但是每当我运行它时,我都会得到第 980 个素数,它什么时候应该输出第 1000 个素数?
testNumber = 1
countPrimes = 0
testCounter = 2
isPrime = False
currentPrime = 0
while(countPrimes <= 1021): #runs for the first 1k primes
testCounter=2
isPrime = True
if(testNumber%2 != 0): #checks if test number is odd
while(testCounter*testCounter < testNumber): #counter^2 needs to be less than testNumber
if(testNumber%testCounter == 0):
isPrime = False
testCounter = testCounter + 1
if(isPrime==True):
countPrimes = countPrimes + 1
currentPrime = testNumber
testNumber+=1
print currentPrime
【问题讨论】:
逻辑完全崩溃了。你对testNumber
做了什么吗?在编码之前将逻辑写在纸上。
@devnull 感谢您指出我没有对 testNumber 做任何事情,我只需要增加它,所以我不认为逻辑被破坏了。但由于某种原因,它现在给了我在我正在寻找的那个之前的首要条件?
当我运行你的代码时,它会打印出 7919,这是第 1000 个素数。这里有什么问题?
@Brionius 对不起,我应该指出。为了得到这个结果,while 循环需要有 countPrimes
我明白了。请参阅下面的答案。
【参考方案1】:
问题在于您的代码还将奇数完全平方(9、25、49 等)计为素数。那是因为你的代码在你得到数字的平方根之前停止测试可分性。要排除完全平方,您需要再检查一个整数:
即而不是:
while(testCounter*testCounter < testNumber): #counter^2 needs to be less than testNumber
试试这个:
while(testCounter*testCounter < testNumber + 1): #counter^2 needs to be less than testNumber
此外,您仍然会是一个,因为您的代码将 0 和 1 视为素数,而不是 2。
【讨论】:
通常写成testCounter*testCounter <= testNumber
。以上是关于寻找第 n 个素数的主要内容,如果未能解决你的问题,请参考以下文章