Найти в Дзене

Программирование на языке Python. Алгоритмы поиска НОД (наибольшего общего делителя)

Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.

Поиск наибольшего общего делителя на Python

Пора вернуться к моей любимой теме - алгоритмы.

Сегодня алгоритм поиска НОД, т.е. наибольшего общего делителя.

Начнём с универсального подхода для произвольного количества целых чисел.

Программу см. ниже. Алгоритм весьма прост. Берём наименьшее из списка число и начинаем проверять на делимость начиная с него. Если это не НОД, то берём его половину, а далее уменьшаем возможный НОД каждый раз на единицу, пока не доберёмся до нужного значения. Работу функции map() и метода split(), надеюсь, не забыли? Алгоритм правда не допускает значение 0, но можете его подправить.

Полный текст программы см. ниже по ссылке
Полный текст программы см. ниже по ссылке
primer223.py

Теперь обратимся к алгоритму Эвклида для двух чисел a и b. Словесно это выглядит так:

  1. Большее число делим на меньшее.
  2. Если делится без остатка, то меньшее число и есть НОД (выходим и печатаем).
  3. Если остаток не ноль, то большее число заменяем на остаток от деления.
  4. Повторяем начиная с пункта 1.

Ну а теперь несколько реализация этого алгоритма.

Пример номер 1. Это, скажем так, наиболее понятная реализация

Полный текст программы см. по ссылке ниже
Полный текст программы см. по ссылке ниже
primer224.py

Пример 2. Пытаемся сократить текст программы

Полный текст программы см. по ссылке ниже
Полный текст программы см. по ссылке ниже
primer225.py

Пример 3. А слабо ещё сократить?

Полный текст программы см. ниже по ссылке
Полный текст программы см. ниже по ссылке
primer226.py

Варианты, конечно, я не исчерпал. Вот ещё один вариант - рекурсивный. Основан, в частности, на том свойстве, что если искать остаток от деления меньшего числа на большее, то результат будет равен меньшему числу. Красиво!

Полный текст программы см. ниже по ссылке
Полный текст программы см. ниже по ссылке
primer227.py

И это ещё не всё, но пора заканчивать.

В библиотеке math, кстати, есть функция gcd(), посмотрите.

Также гляньте статью о НОК.

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

Алгоритм ваших действий прост: ничего не нужно делать.
Алгоритм ваших действий прост: ничего не нужно делать.