# Method 1:

#!/bin/bash

#*******************************************************************************************

# gcd.sh: greatest common divisor uses Eclidean algorithm

# Usage : gcd.sh number1 number2

# The algorithm used to calculate the GCD between two integers is known as the Euclidean

# algorithm(Recursive method).

#*******************************************************************************************

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

# Argument check

ARGS=2

BADARGS=65

if [ $# -ne "$ARGS" ]

then

echo ; echo "Invalid Arguments"

echo "Usage: $0 first-number second-number" ; echo

exit $BADARGS

fi

# Check supplied arguments are integers are not

isnumber()

{

if [ $1 -eq $1 2> /dev/null ]

then

:

# : is a null command.This is the shell equivalent of a "NOP"(do nothing)

else

echo -e "\nYou supplied one bad argument \"$1\" is not a number"

echo -e "Usage: $0 first-number second-number\n"

exit $BADARGS

fi

}

isnumber $1

isnumber $2

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

function Euclidean()

{

if [ $2 -eq 0 ]

then

return $1

else

Euclidean $2 $(($1%$2))

# calling function recursively

fi

}

Euclidean $1 $2

echo "gcd of $1 and $2 is $?"

# $? returns the exit status of script. This is one method to capture return value of a function

exit 0

# Method 2:

#!/bin/bash

# gcd2.sh

# Usage: gcd2.sh number1 number2

# For argument check see method 1

gcd ()

{

dividend=$1

divisor=$2

# Arbitrary assignment.

#! It doesn't matter which of the two is larger.

remainder=1

# If uninitialized variable used in loop,it results in an error message

# on the first pass through loop.

if [ $divisor -eq 0 ]

then

echo "GCD of $dividend and $divisor = $dividend"

exit 0

fi

until [ "$remainder" -eq 0 ]

do

let "remainder = $dividend % $divisor"

# Now repeat with 2 smallest numbers

dividend=$divisor .

divisor=$remainder

done

}

# Last $dividend is the gcd.

gcd $1 $2

echo; echo "GCD of $1 and $2 = $dividend"; echo

exit 0

# Method 3:

#!/bin/bash

# gcd3.sh

# Usage: gcd3.sh

# This script doesn't use command line arguments.You should to enter two numbers when asking

echo enter two numbers

read n1 n2

remainder=1

# Preserve numbers for future use

t1=$n1

t2=$n2

if [ $n2 -eq 0 ]

then

echo "GCD of $n1 and $n2 = $n1"

exit 0

fi

while [ $remainder -ne 0 ]

do

remainder=`expr $n1 % $n2`

# or use

#remainder=$((n1%n2))

n1=$n2

n2=$remainder

done

echo "GCD of $t1 , $t2 is $n1"

Thank you

ReplyDeletewow I like the recursive method. It's nice and simple

ReplyDeleteYou are limited to numbers less than 256.

ReplyDeleteYou cannot return numbers greater than 255 from a function.