
PROGRAM ggt (input, output);

VAR x, y : INTEGER;

FUNCTION ggt1(a,b:INTEGER) : INTEGER;

{Algorithmus 1 iterativ}

   BEGIN
      WHILE a <> b DO
      BEGIN
         IF a > b
         THEN a := a - b
         ELSE b := b - a
      END;
      ggt1 := a;
   END { ggt1};

FUNCTION ggt2(a, b : INTEGER) : INTEGER;

{Algorithmus 1 rekursiv}

   BEGIN
      IF  a = b
      THEN ggt2 := a
      ELSE IF a > b
                 THEN ggt2 := ggt2(a - b, b)
                 ELSE   ggt2 := ggt2(a, b - a)
   END { ggt2 };

FUNCTION ggt3(a, b : INTEGER) : INTEGER;

{Euklidischer Algorithmus iterativ}

VAR r : INTEGER;

   BEGIN
   r := 1;
      REPEAT
         r := a MOD b;
         a := b;
         b := r;
      UNTIL r = 0;
   ggt3 := a
   END { ggt3 };

FUNCTION ggt4 (a, b : INTEGER) : INTEGER;

{Euklidischer Algorithmus rekursiv}

   BEGIN
      IF (a MOD b) = 0
      THEN ggt4 := b
      ELSE ggt4 := ggt4(b, a MOD b)
   END { ggt4};

BEGIN {Hauptprogramm}
   WRITE ('Gib 2 grosse Zahlen ein, die kleiner als ');
   WRITE (maxint);
   WRITELN (' sind.');
   READLN(x);
   READLN(y);
   WRITELN; WRITELN;
   WRITELN('GGT4: = ', ggt4(x,y));
   WRITELN('GGT3: = ', ggt3(x,y));
   WRITELN('GGT1: = ', ggt1(x,y));
   WRITELN('GGT2: = ', ggt2(x,y))

   { ggt2 wurde ans Ende gesetzt, da Gefahr besteht, dass
      Laufzeitfehler (Stackueberlauf) auftritt }
END {ggt} .

