Проблема заключается в вашем внутреннем цикле:
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
все еще False
сзади, когда код обнаружил, что 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:
...