
Program gcd(input, output);


{This program contains three different procedures to compute the
gcd of two positive integers x and y.  The first procedure, Movedown,
starts at the smaller of x and y, say x, and decrements until it finds the
gcd. The second procedure is the standard Euclidean algorithm.  The third
procedure Moveup begins at one and increments looking for a divisor, it then
checks to see if x divided by that divisor is the gcd. The main body 
of the program
needs to be edited when it is determined which procedure to use.}

var
 x,y,gcd:integer;
 done:boolean;
 response:char;

procedure switch(var x,y:integer);
var
  holder:integer;

begin
  holder:=x;
  x:=y;
  y:=holder;
end;

procedure movedown(x,y:integer; var gcd:integer);
var
  divider,num1,num2:integer;
  done:boolean;

begin
  num1:=x;
  num2:=y;
  if num1 > num2
     then switch(num1,num2);

  {num2 is >= num1, now initialize loop}

  divider:=num1;
  done:=false;
  while (divider > 1) and (not done) do
    begin
      if (num1 mod divider = 0) and (num2 mod divider = 0)
        then done := true
        else divider:=divider-1;

    end;
   gcd:=divider;
end;



procedure euclidean(x,y:integer;var gcd:integer);
var
  quotient,num1,num2,remainder,lastnonzero:integer;
  done:boolean;

begin
  num1:=x;
  num2:=y;
  if num1 > num2
     then switch(num1,num2);

  {num2 is >= num1, now initialize loop}

   remainder:=num1;
   repeat
     lastnonzero:=remainder;
     remainder:=num2 mod num1;
     num2:=num1;
     num1:=remainder;
  until remainder = 0;
  gcd:=lastnonzero;

end;

procedure moveup(x,y:integer; var gcd:integer);
var
  divider,num1,num2:integer;
  done:boolean;

begin
  num1:=x;
  num2:=y;
  if num1 > num2
     then switch(num1,num2);

  {num2 is >= num1, now initialize loop}

  divider:=1;
  done:=false;
  while (divider <= num1) and (not done) do
    begin
      if (num1 mod divider = 0) and (num2 mod (num1 div divider) = 0)
        then done := true
        else divider:=divider+1;

    end;
   gcd:=num1 div divider;
end;



Begin
  done:=false;
  Repeat
    Writeln('Enter two positive integers x and y');
    Readln(x,y);
    Writeln('The program is now computing the gcd of ',x:1,' and ',y:1,' ...');

    moveup(x,y,gcd);

    Writeln;
    Writeln('The gcd of ',x:1, ' and ', y:1, ' is ', gcd:1);
    Writeln;
    Writeln('Do you wish to continue? Enter:');
    Writeln('Yes or No');
    Readln(response);
    If (response = 'n') or (response ='N')
       then done:=true;
  Until done;

End.


