使用Python查找Nth prime的枚举

时间:2013-09-18 16:16:41

标签: python loops primes enumeration

我已经决定是时候开始学习编码了。我有一些HTML和CSS的知识,但我希望能够为iOS开发。我知道我还有很长的路要走,但我的目标是一步一步到达那里。

我正在使用iTunes U上的麻省理工学院Python课程,我被困在家庭作业上。我理解枚举的概念并测试每个可能的结果以找到素数,但是到目前为止我所尝试的却让我失望了。我最接近的尝试如下。

# counting confirmed primes. For loop should do remainder tests on
# all testNumbers, unless caught by the if statements that rule out
# multiples of 2,3,5,7 to speed things up. divisor increments by one
# on those numbers that do not get pulled by qualifying if statements

testNumber = 2
confirmedPrime = 0

while (confirmedPrime < 1001):
        for divisor in range(1, testNumber+1):
                if (testNumber/2)*2== testNumber:
                        testNumber += 1
                elif (testNumber/3)*3 == testNumber:
                        testNumber += 1
                elif (testNumber/5)*5 == testNumber:
                        testNumber += 1
                elif (testNumber/7)*7 == testNumber:
                        testNumber += 1
                elif(testNumber%divisor == 0):
                        testNumber += 1
        confirmedPrime +=1
print testNumber

然而,这不会返回我期待的“7919”。它返回“7507”所以某处有一些复合材料在网上滑落。

我已经通过这个网站寻找并没有设法解决它所以我想我会问。

2 个答案:

答案 0 :(得分:4)

这里有几位,所以让我们一步一步走。

首先设置初始值,这是完全合理的。

testNumber=2
confirmedPrime = 0

然后你进入while循环,一直持续到变量confirmedPrime的值已达到(即等于或大于)1001.我想你的任务是找到第1000个素数,但是这样做就像这样你实际上找到了1001,因为while循环一直持续到confirmedPrime的值为1001.将其更改为

while(confirmedPrime < 1000):

你立即进入另一个循环,这是第一个问题,即使它不是给你错误的答案。

    for divisor in range(1, testNumber+1)
        if (testNumber/2)*2 == testNumber:
            ...

for循环中对<3> 5 <和em>的乘数进行测试没有任何意义,因为对于每个值,你只需要对此进行一次testNumber。因此,部分测试应该移出for循环。

    if (testNumber/2)*2 = testNumber: # Why not use modulo here too for consistency?
        testNumber += 1
    elif ...
        ...
    else:
        for divisor in range(...):

下一部分是测试其他更大的除数。您正在测试1到testNumber+1范围内的除数。我不确定你为什么要这样做,但这不是一个好主意,因为当你进行第二次迭代时,你的模数测试将始终返回零,测试testNumber%testNumber。因此,您应该将其更改为testNumber-1,事实上,当您达到testNumber的平方根时,您可以停止,但我会留给您找出原因。

现在出现了最大的问题: for循环结束后,将confirmedPrimes递增1而不实际检查是否找到了素数。因此,只有当第一次测试都没有为真时才会增加confirmedPrimes 没有一个“除数测试”结果为真。

使用下划线而不是mixedCase(这是一个糟糕的python mojo),一致的间距等重写:

import math

test_number = 7       # Already know up to 7
confirmed_primes = 4  # Already know about 2, 3, 5 and 7

while confirmed_primes < 1000:
    test_number += 1

    if test_number % 2 and test_number % 3 and test_number % 5 and test_number % 7:
        is_prime = True

        for divisor in range(11, int(math.sqrt(test_number))+1):
            if test_number % divisor == 0:
                is_prime = False

        if is_prime:
            confirmed_primes += 1

print test_number

答案 1 :(得分:2)

我不确切地知道你的算法应该如何找到素数。

如果一个数字只能被1或他自己整除,那么它就是素数。

另一个定义是,如果一个数字不能被任何小于它的素数整除,那么它就是素数。

这可能是您的算法的基础,加快了整个过程。

def nth_prime(n):
    prime_list = []
    current = 2
    count = 0
    while(count < n):
        is_prime = True
        for prime in prime_list:
            if current % prime == 0:
                is_prime = False
                break
        if is_prime:
            prime_list.append(current)
            count += 1
        current += 1
    return current - 1

print nth_prime(1000) # => 7919