2015-06-16 1 views
2

У меня есть проблема. Я пишу is_prime функцию, но всякий раз, когда я запускаю его, он не будет работать на is_prime(9), и я не могу понять, почему:Моя функция is_prime не работает на 9, и я не знаю почему?

def is_prime(x): 
    if x < 2: ##because negative numbers, 0 and 1 are not prime## 
      return False 
    elif x == 2: 
      return True 
    else: 
     for n in range(2, x): 
      if x % n == 0: 
       return False 
      else: 
       return True 

возвращает True по какой-то причине на is_prime(9)?

+5

эм ... Вы можете думать об этом снова – Basic

+1

Обратите внимание, что 'n' не должны быть проверены до' x'. Квадратного корня из 'x' достаточно. –

+0

диапазон (2, x) также переусердствует, каждое число является простым или составлено простым числом. –

ответ

6

Это потому, что функция не проверяет все подходящих делителей до тех пор, пока она не вернется.

Вместо этого, она выходит рано с True если x не делится на 2, которые не то, что вы хотите для нечетных чисел (например, 9 не делится на 2, но это не простое).

Вместо этого, вы хотите попробовать все возможные делители от 2 к x-1, а затем вернуться, если x делится ни один из них.

Для этого перепишем так:

def is_prime(x): 
    if x < 2: ##because negative numbers, 0 and 1 are not prime## 
      return False 
    elif x == 2: 
      return True 
    else: 
     for n in range(2, x): 
      if x % n == 0: 
       return False 
    return True 
+0

Кроме того, просто для повышения производительности вы должны просто проверять до 'int (n/2)', потому что число после 'int (n/2)' будет делить на n –

+0

@DSM Edited - конечно, это более понятно ! –

+0

@ThomasOrozco: теперь намного лучше. :-) – DSM

Смежные вопросы