簡體   English   中英

試圖找到第1000個素數

[英]Trying to find the 1000th prime number

我正在嘗試在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`

我了解您要嘗試執行的操作,但是很遺憾,您的程序有太多錯誤。 這是一個工作版本。 我做了最小的改變。 希望您可以將以下版本與您自己的版本進行比較,看看您出了什么問題。

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。

(首先,我認為代碼末尾的滴答是堆棧溢出后的錯字,而不是代碼本身)

考慮當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塊,因為它們的條件都是false。

換句話說,當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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM