Ваш x % number not in listrange
будет истинным большую часть времени , даже для простых чисел. Неправильно проверять простые числа.
Скажем, вы начинаете с 7
, простого числа. Первое число, которое будет проверено: 2
:
>>> x = 7
>>> number = 2
>>> x % number
1
Таким образом, остаток составляет 1
. 1
не входит в значения listrange()
(которые идут от 2
до 6
включительно). Это связано с тем, что для любого заданного простого числа, большего 2 , деление на 2 приведет к всегда , в результате чего 1
получится как остаток, а 1
равно никогда в ваш список.
2
- не единственное значение, для которого остаток от деления равен 1. Для простого числа 7919 существует 7 таких чисел:
>>> [i for i in range(2, 7919) if 7919 % i < 2]
[2, 37, 74, 107, 214, 3959, 7918]
, поэтому ваш код будет напечатан Простое число 7 раз. И тест будет верным и для не простых чисел; 9
не является простым числом, но 9 % 2
также является 1
, поэтому ваш код будет утверждать, что 9
является простым числом. Для 1000
, а не простого числа, ваш код будет печатать Простое число 32 раза!
Нельзя утверждать, что число является простым числом, пока вы не проверили все значения в listrange()
и не определили, что нет из этих чисел может делить число без остатка. Поэтому вам нужно проверить после цикла; Вы можете проверить, если emptylist
пусто; это означает, что не было делителей, само определение простого числа:
for number in listrange:
if x % number == 0:
emptylist.append(number)
if not emptylist:
print ("Prime number")
В качестве примечания: вам не нужно превращать объект диапазона в список чисел, тестирование не только if number in range(...):
работает, это лот быстрее, чем использование того же самого тест по списку .