【问题标题】:Trying to find the 1000th prime number试图找到第 1000 个素数
【发布时间】:2016-07-27 04:32:58
【问题描述】:

我正在尝试在 python 中编写一个脚本来查找第 1000 个素数。我不明白为什么这在这里不起作用。基本上,当 mod 小于数字的平方根并且仍有余数时,mod 会增加一。这应该一直持续到 mod 等于数字的平方根。然后支票应该保持在 0 并且数字应该是素数。每次我尝试运行脚本时,它都会告诉我存在系统错误。

import math
b=2
count=2
next_odd=3
next_prime=1
check = 0

while count<=10:
    while b<float(math.sqrt(next_odd)):
        if next_odd%b>0:
                b+=1
        if next_odd%b == 0:
                check+=1
    if check > 0:
        next_prime=next_odd
        next_odd+=2
        print(next_prime)
        b=2
        count+=1`

【问题讨论】:

  • 你在count+=1之后有一个`
  • 什么“系统错误”?
  • 我猜是语法错误
  • 如果我理解正确,那么如果对于任何 b,next_odd%b == 0 那么它会导致检查递增到无穷大。
  • b=2next_odd=3; while b&lt; float(math.sqrt(next_odd)) -> while 2 &lt; 1.732 永远不会发生,bcheck 永远不会改变,这是一个无限循环。如果不是语法错误,我不知道系统错误是什么,但是如果您将其放入自动检查以测试其是否有正确答案,则可能是超时。

标签: python primes


【解决方案1】:

我了解您要执行的操作,但不幸的是,您的程序有太多问题。这是一个工作版本。我做了最小的改变。希望您可以将以下版本与您自己的版本进行比较,看看您哪里出错了。

import math

count=2
next_odd=3
next_prime=1

while count<=1000:
    b=1
    check = 0
    while b<float(math.sqrt(next_odd)):
        b+=1
        if next_odd%b == 0:
            check+=1
    if check == 0:
        next_prime=next_odd
        print(next_prime)
        count+=1
    next_odd+=2

通过上述程序,可以成功确定第 1000 个素数为 7919。

【讨论】:

    【解决方案2】:

    (首先,我假设代码末尾的勾号是堆栈溢出帖子中的错字,而不是代码本身)

    考虑当next_odd 是素数时会发生什么。本块:

    while b<float(math.sqrt(next_odd)):
        if next_odd%b>0:
                b+=1
        if next_odd%b == 0:
                check+=1
    

    将增加b 直到next_odd 的平方根,而不会增加check。这意味着if check &gt; 0: 不会通过,因此count 永远不会增加,然后您只需在 while count<=10: 中旋转,跳过两个if 块,因为它们的条件是错误的。

    换句话说,当next_odd 是素数时,您实际上并没有说要做什么。这也是为什么 while 在您只想通过数字递增时不应该真正使用的示例(这就是您在这里使用它的目的)。试试这样的:

    max_num = 10000 # or whatever
    for odd in range(3, max_num, 2):
        factor_count = 0
        for factor in range(2, math.floor(math.sqrt(max_num)) + 1):
            if odd % factor == 0:
                factor_count += 1
        if factor_count == 0:
            print(odd)
    

    关于这段代码的几点:

    • 全局范围内没有(非常量)变量。这样可以更轻松地推断脚本的状态如何随时间变化。
    • 在 while 循环上使用 for 循环可确保我们的脚本不会因错误(或未说明的)条件而陷入无限循环。
    • 使用 for 循环意味着我们不必担心自己增加所有变量,这大大减少了我们必须管理的状态量。

    希望有帮助!

    哦,请注意,还有更有效的方法来计算素数。见https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

    【讨论】:

    • 打勾是个错误对不起!非常感谢,我知道我哪里出错了。
    猜你喜欢
    • 2018-12-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多