簡體   English   中英

素數的Python函數

[英]Python function for prime number

我想編寫一個函數,該函數返回存在並包含給定數字的質數的數量。 函數count_primes(100)應該返回25

我編寫的代碼給出了23而不是25。該函數跳過41和71,同時計算介於1和100之間的所有其他質數。有人可以解釋為什么我的代碼跳過41和71。我的代碼是

import math
def count_primes(num):
    current_number = 4
    number_of_prime = 2
    while current_number <= num:
        is_prime = True
        if current_number%2==0:
            is_prime = False
            current_number += 1
            continue
        else:
            limit = math.ceil(current_number ** 0.5)+1
            for i in range(3, limit, 2):
                if current_number%i==0:
                    is_prime = False
                    current_number += 1
                    continue
        if is_prime == True:
            print(current_number)
            number_of_prime += 1
        current_number += 1
    return number_of_prime
count_primes(100)

我寫了另一個功能很好的函數。 我只想知道為什么此代碼僅跳過41和71。

問題出在你的內循環中:

for i in range(3, limit, 2):
    if current_number%i==0:
        is_prime = False
        current_number += 1
        continue

此處的continue語句僅繼續內部循環,而不繼續外部循環。 這意味着,每當您測試一個復合數字時,它都會增加current_number但不會回到2的除數測試。

例如,在以current_number == 39開始的外循環迭代中,代碼發現它可以被3整除,因此它將current_number遞增到40,並繼續內循環,而不是外循環。 因此,它將40除以5,而不是3。並且將40除以5,則繼續測試41的7除數。當然,不能將41除以7,但是is_prime從后面返回時仍然為False 。代碼發現39可被3整除,因此41不會被打印。

這是一種非常特殊的情況組合,僅會影響您正在測試的范圍內的41和71,因為它們遵循幾個相當大的復合數字(即39,40和69,70)的序列。

我建議您自己動手完成這項工作:將打印語句放在要進行除法測試的位置,然后您會清楚地看到會發生什么。 例如:

print('testing {} for divisibility by 2: {}'.format(current_number, current_number % 2 == 0))
if current_number%2==0:
    is_prime = False
    ...

后來

print('testing {} for divisibility by {}: {}'.format(current_number, i, current_number % i == 0))
if current_number%i==0:
    ...

修復了代碼並添加了注釋:

import math
def count_primes(num):
    current_number = 4
    number_of_prime = 2
    while current_number <= num:
        is_prime = True
        if current_number%2==0:
            is_prime = False
            current_number += 1
            continue
        else:
            limit = math.ceil(current_number ** 0.5)+1
            for i in range(3, limit, 2):
                if current_number%i==0:
                    is_prime = False
                    #current_number += 1 #first increment
                    continue
                    #This continue statement does not skip the next lines (after the for loop) so you increment current_number twice
        if is_prime == True:
            print(current_number)
            number_of_prime += 1
        current_number += 1 #second increment
    return number_of_prime
count_primes(100)

暫無
暫無

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

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