Есть некоторые сомнения в этой программе на python (ПРОСТАЯ или НЕТ)

#python #python-3.x #math

Вопрос:

Итак, я написал код, чтобы определить, является ли число ПРОСТЫМ или НЕТ…

Я написал это 2 разными способами, они почти одинаковые, но у меня просто были сомнения. Итак, вот оно:

1-й код:

 num = int(input("Enter the number: ")) lim = num//2   1 for i in range(2,lim):  if num % i == 0:  print("Prime!")  break else:  print("Not Prime!")  

2-й Код:

 num = int(input("Enter the number: ")) for i in range(2,num):  if num % i == 0:  print("Prime!")  break else:  print("Not Prime!")  

1-й код принимает входные данные(num) и в соответствии с входными данными устанавливает ограничение(которое равно половине числа 1) , а затем проверяет, делится ли число на все числа в диапазоне (от 2 до lim)

Второй такой же, но вместо того, чтобы устанавливать ограничение, он просто проверяет все числа ниже входных, что означает, что ему нужно выполнить немного больше работы…

Теперь оба они почти одинаковы, единственная разница в том, что я сохранил строку во 2-й, и эффективность вывода также выше!

Какой код вы бы хотели, чтобы я предпочел/

также, если в этом коде есть какие-либо проблемы, было бы полезно указать на них! Спасибо 🙂

Комментарии:

1. Во — первых, эффективность — это совпадение, кроме того, ваш партнер находится в действительно неловком положении. Используйте логическое значение, например, isprime а затем установите флажок false, если это не так, а затем, наконец, выведите на основе этого.

2. Будьте добры, эллаборате!

3. Я добавил это в качестве ответа — надеюсь, это поможет

4. И то, и другое ужасно неэффективно по сравнению с остановкой на полу(sqrt(число)).

Ответ №1:

Объяснение

Самая важная часть итерации, а именно определение того, является ли число простым или нет, состоит в том, чтобы отслеживать его. Без этого процесса и в программе операции переменная не используется для обработки этого, что означает, что он каждый раз проверяет, является ли число простым или нет, и в этот момент делает вывод. Он также использует else утверждение, которое синтаксически неверно.

Чтобы предотвратить это, мы можем использовать переменную для отслеживания этого. Давайте назовем это isprime . Нам нужно предположить, что число всегда будет простым, если не указано иное. Этого можно достичь , установив значение по умолчанию isprime be True и установив его False равным, когда мы придем к выводу, что это не простое число, потому что у is есть делитель. Наконец, мы можем проверить эту переменную в конце и определить, является ли это число простым или нет, потому что оно будет установлено в False «если нет» или оставлено как True есть.

Еще одно замечание состоит в том, что предел для определения простых чисел может быть уменьшен до sqrt(n) . Это происходит потому, что нам не нужно находить каждый фактор, если он существует, просто его наименьший соответствующий фактор. Давайте рассмотрим пример:

Факторы, влияющие на 24: 2, 3, 4, 6, 8, 12

Мы можем прекратить проверку на наличие факторов прямо здесь:

2, 3, 4 | 6, 8, 12, 24

Это связано с тем, что если число имеет коэффициент (например, больше квадратного корня), оно будет иметь соответствующий коэффициент меньше квадратного корня. В результате мы можем установить наш предел sqrt(n) , равный , просто для душевного спокойствия временная сложность O(sqrt(n)) v O(n) .

Как дополнительная заметка, sqrt не встроен в Python. Вам придется импортировать его из math библиотеки с помощью:

 from math import sqrt  

Окончательный Код

 # Setup num = int(input("Enter the number: ")) lim = sqrt(num) isprime = True  # Loop amp; check for i in range(2,lim):  if num % i == 0:  isprime = False  break  # Results if isprime:  print("Prime!") else:  print("Not prime!")  

Ответ №2:

Логика решения неверна. Вы дали, чтобы переключить теги «Прайм» и «Не Прайм». Как следует;

 num = int(input("Enter the number: ")) lim = num//2   1 for i in range(2,lim):  if num % i == 0:  print("Not Prime!")  break else:  print("Prime!")  

Решение 1 более эффективно, потому что вам не нужно выполнять дополнительные вычисления для проверки num//2 1. Так что это предпочтительнее.

Комментарии:

1. вы сказали, что решение 1 предпочтительнее… но есть ли какие-либо проблемы во 2-м коде? или просто для этого потребуется больше вычислительной мощности?

2. Они по сути одинаковы, вам также нужно сделать обмен там. Для чисел, которые не являются простыми и делимыми, скажем, 2 или 3. Цикл немедленно прерывается и создает у вас впечатление, что он более эффективен, потому что вы пропустили назначение переменной lim (сэкономите вам 0,000 ххх секунд вычислений). С другой стороны, попробуйте найти простые числа из 8 и 9 цифр и поместить их в свои функции, где это займет примерно вдвое больше времени во втором коде. Кроме того, я советую вам искать функцию isprime для оптимизированной реализации, если вам не нужно реализовывать ее самостоятельно.