2013-10-15 4 views
0

Привет, я делаю функцию, которая проверяет, является ли число простым или нет, но оно говорит мне, что 9 является простым.Python, проверка числа простых чисел

def eprimo(num): 
    if num < 2: 
     return False 
    if num == 2: 
     return True 
    else: 
     for div in range(2,num): 
      if num % div == 0: 
       return False 
      else: 
       return True 
+0

В чем вопрос? – Alexis

+1

Пройдите через свой код. Что вы пробовали? – UpAndAdam

+0

Как примечание по эффективности, вам нужно всего лишь проверить от 2 до num/2 –

ответ

2

Вы собираетесь вернуться с первой итерации этого цикла, выполнили ли вы проверку или нет. Вы не должны возвращаться из цикла, если число определенно не является простым. Удалите else и верните только True, если петля завершается.

def eprimo(num): 
    if num < 2: 
     return False 
    if num == 2: 
     return True 
    else: 
     for div in range(2,num): 
      if num % div == 0: 
       return False 
     return True 

Оптимизация примечание стороны: Вы действительно не нужно, чтобы проверить всех кандидатов делителей до num. Вам нужно только проверить квадратный корень от num.

6

Ваш цикл for завершается сразу после первой итерации, когда он проверяет, делится ли ваш номер на 2. Если ваш номер четный, он вернет False; в противном случае он вернет True.

Решение не должно возвращать True; ждать окончания всех итераций в цикле вместо:

for div in range(2, num): 
    if num % div == 0: 
     return False 
return True 

В качестве альтернативы, используйте all() конструкцию:

return all(num % div != 0 for div in range(2, num)) 
0

Вместо тестирования всех делителей в диапазоне (2, NUM), вы могли бы извлечь тест для четных чисел, а затем цикл только на нечетные числа. Кроме того, как предлагает Билл Ящерица, вы можете остановиться у квадратного корня из числа. Это будет в два раза быстрее:

def eprimo(num): 
    if num < 2: 
     return False 
    if num % 2 == 0: 
     return num == 2 
    div = 3 
    while div * div <= num: 
     if num % div == 0: 
      return False 
     div += 2 
    return True 
Смежные вопросы