【问题标题】:Python function for prime number素数的Python函数
【发布时间】:2018-10-21 09:44:23
【问题描述】:

我想编写一个函数,它返回存在的素数的数量,包括给定的数字。函数 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。

【问题讨论】:

  • 请解释你在代码中做了什么

标签: python python-3.x primes


【解决方案1】:

问题在于你的内部循环:

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 仍然是 @987654327 @ from back 当代码发现 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:
    ...

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 这似乎不能很好地解释为什么问题中的代码不起作用。
    • 您的代码运行良好。但我想知道为什么它只跳过 41 和 71。
    • @DavidZ 这个问题没有答案,我没有时间解释更多。我认为代码中的 cmets 为这里的问题提供了很好的线索。
    • @ParthoDas 我所做的更新应该可以帮助您找到它跳过 41 和 71 的原因。无论如何,DavidZ 给了您所需的一切
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2021-05-14
    • 2021-12-30
    • 1970-01-01
    • 2022-11-05
    • 2012-10-28
    • 2019-05-09
    相关资源
    最近更新 更多