Проверка простоты числа перебором делителей. Решение задачи на Python

  Рет қаралды 12,036

Лаборатория линуксоида

Лаборатория линуксоида

2 жыл бұрын

Пользователь вводит натуральное число больше единицы. Надо определить, простое оно или сложное.
Поскольку надо вывести только одно из этих сообщений, либо то, либо другое, понадобится условный оператор.
Если число простое, то выведем такую надпись. Иначе, то есть когда число сложное, выведем другую.
Переменной simple присвоим истину, то есть изначально будем предполагать, что было введено простое число.
Если в процессе проверки окажется, что число сложное, то значение simple поменяем на False, то есть ложь.
Тестировать на простоту будем методом перебора делителей. Это значит, надо проверять делится ли заданное число нацело на натуральные числа, которые ему предшествуют. И эти предшествующие числа будем перебирать друг за другом, начиная с двойки.
Перебирать их будем в цикле, постепенно увеличивая i.
В теле цикла надо узнавать, делится ли число n на текущее значение i. В таком случае остаток от деления будет равен нулю. Знак процента в Python - это нахождение остатка от деления.
Если это так, то число не может быть простым. Потому что простые числа делятся только на единицу и самих себя. А мы перебираем i от двух до числа меньше чем n.
Чтобы обозначить, что число сложное, присваиваем simple значение False.
Смотрим, как работает программа. Вводим простое число, теперь сложное.
Но давайте посмотрим, как много раз выполняется тело цикла и с каким значением simple заходит в него.
Уже при заходе на вторую итерацию переменная simple имела значение False. И в этой и в последующих итерациях смысла нет. Потому что 12 нацело делится на два, и дальше проверять натуральные числа уже нет необходимости.
Можно прервать выполнение цикла, поместив в его тело оператор break.
Теперь, как только будет обнаружен делитель, поменяется не только значение simple, но и произойдет выход из цикла.
Однако мы избегаем лишних итераций цикла лишь в том случае, если вводится сложное число.
Если же простое, в if поток выполнения никогда не заходит.
Но надо ли пытаться делить число на все предшествующие ему числа?
Смотрите, если заданное число делилось бы на число в середине ряда, то вторым его делителем была бы двойка. Но если мы переходим середину, то второй делитель должен быть меньше двойки, а этого быть не может. Значит, как минимум перебирать числа надо не до n, а до n деленного на 2.
Но и это еще не всё. Если мы имеем дело со сложным числом, то оно как и простое делится на себя и единицу. Однако кроме этого имеет и другие делители. И эти другие делители появляются не по одному, а парами. То есть если, например, число делится на 2, то будет еще какой-то делитель, который при умножении на 2 даст нам заданное число.
Чем больше больший делитель, тем меньше меньший делитель.
Если мы берем самый большой из меньших делителей, то его парой будет самый маленький делитель из больших.
Но есть граница, когда оба делителя могут быть равны, - это квадратный корень из исследуемого числа. Можно сказать, он является максимально возможным делителем в ряду меньших делителей.
Поэтому если мы не находим делитель до квадратного корня включительно, значит у числа их вообще нет, и оно простое.
Это работает и для простых чисел. Фактически нам здесь надо перебирать только до четырех. Потому что четыре в квадрате - это 16. А 5 в квадрате - уже 25, это больше семнадцати.
Поэтому в условии цикла мы можем извлечь квадратный корень из n.
Текстовое описание решения задачи и исходный код программы: younglinux.info/algorithm/div...
Больше задач: younglinux.info/python/task
Приложение для андроид: play.google.com/store/apps/de...
Купить PDF-версию (100 задач): younglinux.info/store/store.h...

Пікірлер: 11
@millenniumqq3681
@millenniumqq3681 9 ай бұрын
Спасибо за разбор! Алгоритмы как всегда решают)
@user-tk6yf9rp3r
@user-tk6yf9rp3r 9 ай бұрын
спасибо большое, все очень подробно и толково разложено.
@ABDULHAMIDGULOV
@ABDULHAMIDGULOV 9 ай бұрын
Спасибо большое тебе за такое видео и объяснение
@tenelokis
@tenelokis 2 жыл бұрын
спасибо большое за объяснения
@user-vo6vo5ed1q
@user-vo6vo5ed1q 9 ай бұрын
Супер, очень помогли!
@naukafjn3264
@naukafjn3264 5 ай бұрын
yes,
@golovatskii_r
@golovatskii_r Жыл бұрын
фЭлс) Спасибо, разобрался!
@user-tk6yf9rp3r
@user-tk6yf9rp3r 8 ай бұрын
здравствуйте, а почему когда , например. число 12 то при первом i = 2. simple = True, по условию должно сменится на False?
@younglinux
@younglinux 8 ай бұрын
В теле цикла print(i, simple) выполняется раньше, чем изменение значения переменной simple.
@pite931
@pite931 Жыл бұрын
Я не понял
@pite931
@pite931 Жыл бұрын
Я тупой сорян
Gym belt !! 😂😂  @kauermtt
00:10
Tibo InShape
Рет қаралды 16 МЛН
A clash of kindness and indifference #shorts
00:17
Fabiosa Best Lifehacks
Рет қаралды 123 МЛН
Простые числа - основа математики
8:57
Wild Mathing
Рет қаралды 123 М.
Как узнать простое число или нет?
10:19
Математика с Виктором Лазаревым!
Рет қаралды 5 М.
Цикл while. Python. Задачи.
32:21
Олег Антсон
Рет қаралды 10 М.
Умение парсить на Python - изменит твою жизнь
9:44
Чёрный Треугольник
Рет қаралды 145 М.
Числа Фибоначчи. Решение задачи на Python
5:36
Лаборатория линуксоида
Рет қаралды 34 М.
Простые и составные числа. Математика 6
4:53
Мини уроки по математике
Рет қаралды 80 М.
7  ПАРАДОКСОВ БЕСКОНЕЧНОСТИ
36:02
Mathin
Рет қаралды 632 М.
Gym belt !! 😂😂  @kauermtt
00:10
Tibo InShape
Рет қаралды 16 МЛН