素数的Python函数

素数的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

我想写一个函数,返回一个给定数之前存在的素数。函数计数_素数(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)
导入数学
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的原因。不管怎样,戴维兹给了你所需要的一切