簡體   English   中英

python中的素數代碼是如何工作的?

[英]How the Prime number code in python works?

def is_prime(num):
    for i in range(2,num):
        if (num % i) == 0:
            return False
    return True

def all_primes(num):
    primes = []
    for n in range(2,num+1):
        if is_prime(n) is True:
            primes.append(n)
    return primes

num = int(input("Enter upper limit: "))
primes = all_primes(num)
print(primes)

它是如何發生的... 理解的是,如果我輸入 10 它將是 10%2=5...余數為 0 所以它跳到下一個 9%2 = True 有余數。

它移動到下一個 9%3 余數是 0 所以它跳到 8% ...,然后是 7 ......但是我不明白的是 7 如果它檢查直到 7%7 ==0 那么如何是不是加了 7 作為素數???

我很困惑。

感謝您的任何評論

但我不明白的是 7 如果它檢查到 7%7 ==0

來自以下行的range函數

for i in range(2, num):

2num - 1

因此, range()函數不包括結果中的最后一個(停止)數字。

你理解錯了。 如果你輸入10 ,它不會檢查10%2然后是9%2 ...

它會檢查10%2 ,然后是10%3 ,然后是10%4 ... 即它會檢查10%i ,因為i范圍從29 但是,請注意,一旦余數為 0, is_prime中的執行is_prime停止:

for i in range(2,num):
        if (num % i) == 0:
            return False

因此,如果num10 ,則只會檢查10%2 ,並且由於它是0 ,它將立即返回false

例如,如果num9 ,它將檢查9%2 由於余數不是0 ,它會向上移動到檢查9%3 那里的余數是0 ,所以在這種情況下它會返回false

如果num7 ,它會檢查7%2 余數不是0所以它檢查7%3 ,這也不同於0 ,依此類推。 最后執行的檢查將是7%6 ,因為for i in range(2,num)意味着它將迭代i范圍從2num-1 在這種情況下, is_prime(7)將返回true因為7%i ,其中i范圍從26不同於0

素數,顧名思義,就是一個只能被它自己和1整除的數。

因此,您的函數is_prime獲取您要檢查的數是否為素數,並嘗試在區間 [2, num) 內找到任何其他可以整除它的數,該區間是使用函數range(2,num)在 for 循環內。

如果它找到任何情況,即如果滿足if (num % i) == 0 ,我們知道有一個數可以整除它,因此,根據定義,它不是素數。 檢查整個列表后,如果找不到除數,我們可以說該數字是素數,即在您的函數上return True

Example:
You want to check 9
(1st step) num = 9, i = 2. 9%2 != 0, we continue in the loop with next value of i.
(2nd step) num = 9, i = 3. 9%3 == 0, we return False. As we know, 9 can divide by 3.

Another example:
You want to check 7
num = 7, i = 2 7%2 != 0, so we continue in the loop with the next value of i
num = 7, i = 3 7%3 != 0, so we continue in the loop with the next value of i
num = 7, i = 4 7%4 != 0, so we continue in the loop with the next value of i
num = 7, i = 5 7%5 != 0, so we continue in the loop with the next value of i
num = 7, i = 6 7%6 != 0, so we continue in the loop with the next value of i

The if was never fulfilled, therefore we reach the end of the loop and 
call the next command, which is return True. 

當為編號7調用is_prime時,循環將僅從2運行到6 因此永遠不會檢查7%7 ,在這種情況下返回 True 。

讓我們分別考慮這兩個函數:

def is_prime(num):
    for i in range(2,num):
        if (num % i) == 0:
            return False
    return True

這像這樣工作:

  • 讓我們考慮一個數字num
  • 得到一個變量i來假設值2
  • 評估條件num % i == 0
  • 如果滿足條件,則退出函數並返回False
  • 否則將i增加 1 並重復最后兩步直到i等於num - 1
  • 退出函數並返回True

因此,這永遠不會評估7 % 7 :當num7時, i的最后一個值為6


def all_primes(num):
    primes = []
    for n in range(2,num+1):
        if is_prime(n) is True:
            primes.append(n)
    return primes

這會得到一個數字num ,這是要考慮的數字的上限,然后:

  • 它創建一個名為primes的空list
  • 它從2循環n直到排除num + 1 (或包括num
  • 如果is_prime(n)的結果為 True,則將數字附加到list
  • 最后,返回primeslist

最后是腳本的主體:

num = int(input("Enter upper limit: "))
primes = all_primes(num)
print(primes)

從鍵盤獲取一個字符串,將其轉換為int並分配給num ,然后調用all_primes(num)並將其結果分配給primes並將list打印到屏幕。


因此,當您從鍵盤輸入10時,它會檢查從210的值是否為is_prime()素數,而不是從10並減少它們,正如您似乎建議的那樣。

暫無
暫無

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

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