Вам нужно прекратить итерации, если вы знаете, что число не простое. Добавьте break
, как только найдете простое число, чтобы выйти из цикла while.
Внесение только минимальных изменений в ваш код, чтобы он работал:
a=2
num=13
while num > a :
if num%a==0 & a!=num:
print('not prime')
break
i += 1
else: # loop not exited via break
print('prime')
Ваш алгоритм эквивалентен:
for a in range(a, num):
if a % num == 0:
print('not prime')
break
else: # loop not exited via break
print('prime')
Если вы добавите его в функцию, вы можете обойтись без break
и for-else:
def is_prime(n):
for i in range(3, n):
if n % i == 0:
return False
return True
Даже если вы собираетесь использовать грубую силу для простого числа, вам нужно всего лишь пройти до квадратного корня из n
. Также вы можете пропустить проверку четных чисел после двух.
С этими предложениями:
import math
def is_prime(n):
if n % 2 == 0 and n > 2:
return False
for i in range(3, int(math.sqrt(n)) + 1, 2):
if n % i == 0:
return False
return True
Обратите внимание, что этот код неправильно обрабатывает 0
, 1
и отрицательные числа.
Мы упростим это, используя all
с выражением генератора для замены цикла for.
import math
def is_prime(n):
if n % 2 == 0 and n > 2:
return False
return all(n % i for i in range(3, int(math.sqrt(n)) + 1, 2))
Если вы работаете в Linux / BSD Unix, взгляните на queue (3) и проверьте /usr/include/sys/queue.h
- это было сделано раньше :)
A recent question raised quite a few shameless preprocessor abusing libraries.