Пример 8-1. Наибольший общий делитель

Пример 8-1. Наибольший общий делитель

#!/bin/bash

# gcd.sh: поиск наибольшего общего делителя

# по алгоритму Эвклида

# Под "наибольшим общим делителем" (нод) двух целых чисел

#+ понимается наибольшее целое число, которое делит оба делимых без остатка.

# Алгоритм Эвклида выполняет последовательное деление.

# В каждом цикле,

#+ делимое <--- делитель

#+ делитель <--- остаток

#+ до тех пор, пока остаток не станет равным нулю (остаток = 0).

#+ The gcd = dividend, on the final pass.

#

# Замечательное описание алгоритма Эвклида можно найти

# на сайте Jim Loy, http://www.jimloy.com/number/euclids.htm.

# ------------------------------------------------------

# Проверка входных параметров

ARGS=2

E_BADARGS=65

if [ $# -ne "$ARGS" ]

then

echo "Порядок использования: `basename $0` первое-число второе-число"

exit $E_BADARGS

fi

# ------------------------------------------------------

gcd ()

{

# Начальное присваивание.

dividend=$1 # В сущности, не имеет значения

divisor=$2 #+ какой из них больше.

# Почему?

remainder=1 # Если переменные неинициализировать,

#+ то работа сценария будет прервана по ошибке

#+ в первом же цикле.

until [ "$remainder" -eq 0 ]

do

let "remainder = $dividend % $divisor"

dividend=$divisor # Повторить цикл с новыми исходными данными

divisor=$remainder

done # алгоритм Эвклида

} # последнее $dividend и есть нод.

gcd $1 $2

echo; echo "НОД чисел $1 и $2 = $dividend"; echo

# Упражнение :

# --------

# Вставьте дополнительную проверку входных аргументов,

#+ и предусмотрите завершение работы сценария с сообщением об ошибке, если

#+ входные аргументы не являются целыми числами.

exit 0

+=

"плюс-равно" (увеличивает значение переменной на заданное число)

let "var += 5" значение переменной var будет увеличено на 5.

-=

"минус-равно" (уменьшение значения переменной на заданное число)

*=

"умножить-равно" (умножить значение переменной на заданное число, результат записать в переменную)

let "var *= 4" значение переменной var будет увеличено в 4 раза.

/=

"слэш-равно" (уменьшение значения переменной в заданное число раз)

%=

"процент-равно" (найти остаток от деления значения переменной на заданное число, результат записать в переменную)

Арифметические операторы очень часто используются совместно с командами expr и let.