试图找到第1000个素数

时间:2016-07-27 04:32:58

标签: python primes

我正在尝试在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`

2 个答案:

答案 0 :(得分:2)

我明白你要做什么,但不幸的是你的程序有太多问题。这是一个工作版本。我做了很小的改动。希望您可以将以下版本与您自己的版本进行比较,看看您哪里出错了。

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。

答案 1 :(得分:2)

(首先,我假设您的代码末尾的刻度是堆栈溢出帖子中的拼写错误,而不是代码本身)

考虑comment素数时会发生什么。这个块:

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 > 0:永远不会递增,然后您只需在count中旋转,跳过两个 while count<=10:块,因为他们的条件是假的。

换句话说,当if为素数时,你实际上并没有说要做什么。这也是为什么next_odd当你想要做的就是通过数字递增时才能真正使用的原因(这就是你在这里使用它的原因)。尝试这样的事情:

while

有关此代码的几点意见:

  • 全局范围内没有(非常数)变量。这使得更容易推断脚本状态随时间的变化。
  • 在while循环中使用for循环可以保证我们的脚本不会因为错误(或未解释的)条件而陷入无限循环。
  • 使用for循环意味着我们不必担心自己增加所有变量,这会大大减少我们必须管理的状态量。

希望有所帮助!

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