我想编写一个函数,该函数返回存在的给定数(包括给定数)的质数。函数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。
答案 0 :(得分:3)
问题出在你的内循环上
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
仍然是当代码发现39被3整除后,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:
...
答案 1 :(得分:0)
修复代码并添加注释:
for a in range(something):
list( f 'distance_{a}') = distance_sum_by_residue[a]