[英]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.