素数的Python函数
我想写一个函数,返回一个给定数之前存在的素数。函数计数_素数(100)应返回25 我写了一个代码,它给出23而不是25。函数跳过41和71,同时计算1到100之间的所有其他素数。有人能解释为什么我的代码跳过41和71吗。我的代码是素数的Python函数,python,python-3.x,primes,Python,Python 3.x,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
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)
导入数学
def计数_素数(num):
当前_编号=4
素数的个数=2
当当前_编号修复代码并添加注释时:
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)
导入数学
def计数_素数(num):
当前_编号=4
素数的个数=2
当当前_编号修复代码并添加注释时:
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)
导入数学
def计数_素数(num):
当前_编号=4
素数的个数=2
当当前的_数时,问题在于您的内部循环:
for i in range(3, limit, 2):
if current_number%i==0:
is_prime = False
current_number += 1
continue
这里的continue
语句只继续内部循环,而不是外部循环。这意味着,无论何时测试一个复合数,它都会增加当前的_数,但不会返回到测试2的可除性
例如,在以current_number==39
开始的外部循环的迭代中,代码发现它可以被3整除,因此它将current_number
增加到40,并继续内部循环,而不是外部循环。所以它测试了40被5整除,而不是被3整除。因为40可以被5整除,它继续测试41是否可以被7整除。当然41不能被7整除,但是当代码发现39可以被3整除时,is_prime
仍然是False
,因此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:
...
问题在于您的内部循环:
for i in range(3, limit, 2):
if current_number%i==0:
is_prime = False
current_number += 1
continue
这里的continue
语句只继续内部循环,而不是外部循环。这意味着,无论何时测试一个复合数,它都会增加当前的_数,但不会返回到测试2的可除性
例如,在以current_number==39
开始的外部循环的迭代中,代码发现它可以被3整除,因此它将current_number
增加到40,并继续内部循环,而不是外部循环。所以它测试了40被5整除,而不是被3整除。因为40可以被5整除,它继续测试41是否可以被7整除。当然41不能被7整除,但是当代码发现39可以被3整除时,is_prime
仍然是False
,因此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:
...
请解释你在代码中做了什么请解释你在代码中做了什么这似乎不能很好地解释为什么问题中的代码不起作用。你的代码工作得很好。但我想知道为什么它只跳过了41和71节。@DavidZ这个问题没有答案,我没有时间解释更多。我认为代码中的注释提供了关于这个问题的很好的线索。@ParthoDas我所做的更新应该帮助您找到它跳过41和71的原因。不管怎样,DavidZ给了你所有你需要的东西这似乎不能很好地解释为什么问题中的代码不起作用。你的代码工作得很好。但我想知道为什么它只跳过了41和71节。@DavidZ这个问题没有答案,我没有时间解释更多。我认为代码中的注释提供了关于这个问题的很好的线索。@ParthoDas我所做的更新应该帮助您找到它跳过41和71的原因。不管怎样,戴维兹给了你所需要的一切