繁体   English   中英

用Python枚举查找第N个素数

[英]Enumeration to find Nth prime with Python

我决定现在应该开始学习编码了。 我对HTML和CSS有所了解,但我希望能够为iOS开发。 我知道我还有很长的路要走,但我的目标是一步一步到达那里。

我正在通过iTunes U上的MIT 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”,因此在某处有一些复合材料通过网络滑落。

我已经在这个网站上搜寻并没有解决它,所以我想问一下。

这里有些地方不对,让我们逐步进行。

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

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循环 for 2、3、5和7的乘法器进行测试没有任何意义,因为对于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或他自己整除,则称该数字为质数。

另一个定义是,如果一个数字不能被任何小于该数字的质数整除,则称该数字为质数。

这可能是您算法的基础,从而大大加快了处理速度。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM