Нахождение наибольшего общего делителя двух чисел в Bash - PullRequest
0 голосов
/ 11 декабря 2019

Я кодирую программу, которая вычисляет GCD из двух чисел. Моя проблема возникает в некоторых случаях ввода:

GCD (88, 100) = 4

Но моя программа возвращает пустое место (как будто она не может получить $gcd), но я не дошел до точной проблемы в моемкод еще.

#!/bin/bash

while true; do
    read a b
    gcd=$a
    if [ $b -lt $gcd ]; then
        gcd=$b
    fi
    while [ $gcd -ne 0 ]; do
        x=`expr $a % $gcd`
        y=`expr $b % $gcd`
        if [ $x -eq 0 -a $y -eq 0 ]; then
            echo "GCD ($a, $b) = $gcd"
        break
        fi
    done
done

1 Ответ

1 голос
/ 12 декабря 2019

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

gcd() (
    ! (( $1 % $2 )) && echo $2 || gcd $2 $(( $1 % $2 ))
)

функция использует троичный оператор test && cmd1 || cmd2 и рекурсию (она сама себя вызывает). Или определите более читаемую версию функции:

gcd() (
    if (( $1 % $2 == 0)); then
        echo $2
     else
        gcd $2 $(( $1 % $2 ))
    fi
)

Тест:

$ gcd 88 100
4
...