寻找第 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 &lt;= testNumber

以上是关于寻找第 n 个素数的主要内容,如果未能解决你的问题,请参考以下文章

任意范围素数寻找|Python练习系列[7]

寻找素数对

寻找素数的三种算法,一个比一个快

寻找List之和的最近素数

寻找素数分配线程算法

(C++)寻找1-100以内所有素数,复杂度为O(nsqrt(n))与O(nloglogn)的两种方法