素数的Python函数

时间:2018-10-21 09:44:23

标签: python python-3.x primes

我想编写一个函数,该函数返回存在的给定数(包括给定数)的质数。函数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。

2 个答案:

答案 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]