Не могу определить 2 как простое число или нет - PullRequest
1 голос
/ 19 октября 2019

Я пытаюсь определить простые числа, но мой алгоритм не распознает 2 как prime number. Вместо этого верните None. Я пробую это в Google Colab, Jupiter Notebook и PyCharm с тем же результатом.

Мой код:

# V1) Test all divisors from 2 through n-1. (skip 1 and n)
def is_prime_v1(n):
  """ Return 'True' if 'n' is a prime number. False otherwise. """
  if n == 1:
    return False # 1 is not prime

  for d in range(2, n):
    if n % d == 0:
      return False # Is not prime
    return True

# ===== Test Function =====
for n in range(1, 21):
  print(n, is_prime_v1(n))

Мой вывод:

1 False
2 None
3 True
4 False
5 True
6 False
7 True
8 False
9 True
10 False
11 True
12 False
13 True
14 False
15 True
16 False
17 True
18 False
19 True
20 False

Дополнительновозвращаемое значение имеет некоторые ошибки, например, 9 не является prime number.

Этот код начинается с 0:46: Python и простых чисел ||Python Tutorial ||Изучите программирование на Python

Ответы [ 3 ]

2 голосов
/ 19 октября 2019

Поскольку ваша программа никогда не входит в цикл.

for d in range(2, n):
    if n % d == 0:
      return False # Is not prime
    return True

начинается с 2 до n-1. Кроме того, вы должны сделать отступ по-другому. Только после того, как ваша программа вышла из цикла, вы должны return True:

for d in range(2, n):
    if n % d == 0:
      return False # Is not prime
return True

Но если вы хотите оптимизировать свою функцию, она должна выглядеть следующим образом:

def is_prime_v1(n):
    if n <= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    for d in range(3, round(n**0.5) + 1, 2):
        if n % d == 0:
            return False
    return True

Поскольку вам не нужнопроверить до самого числа, только это квадратный корень. Кроме того, ни одно число, которое даже не может быть простым (кроме 2), поскольку оно будет делиться на два.
РЕДАКТИРОВАТЬ:
Я рад, что мой ответ помог:)

1 голос
/ 19 октября 2019

Вы можете явно определить 2 как простое число.

Возвращаемое значение True равно внутри вашего цикла for и поэтому возвращает значение true только после 1 итерации (поэтому у вас есть ошибки).

Для простых достаточно проверить только до квадратного корня числа, которое вы тестируете, это должно значительно ускорить процесс при больших n.

Попробуйте это

def is_prime_v1(n):
  """ Return 'True' if 'n' is a prime number. False otherwise. """
  if n == 1:
    return False # 1 is not prime
  elif n == 2:
    return True

  for d in range(2, int(n**0.5) + 1):
    if n % d == 0:
      return False # Is not prime
  return True
0 голосов
/ 19 октября 2019
for d in range(2, n):
    if n % d == 0:
        return False # Is not prime
    return True

Создайте отдельный, если для него, как вы сделали для 1.

if n == 2:
    return True #2 is prime
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...