(* Divide an integer by a natural number, using operations of
  addition, subtraction    , doubling and halving only.  Repeat
  reading pairs of integers, until you encounter a 0.  For each pair,
  print dividend, divisor, quotient, and remainder.  Indicate
  invariant of loop.*)

MODULE divide;
FROM Terminal IMPORT WriteString, WriteLn;
FROM InOut    IMPORT ReadInt,WriteInt;

VAR a,b,q,r:INTEGER;

PROCEDURE divide(x,y: INTEGER; VAR z,a:INTEGER);
VAR q,r,w: INTEGER;

BEGIN
 r := x; w := y; q := 0;
 WHILE w <= r DO w := 2*w END;
 WHILE w # y DO
   w := w DIV 2;
   q := 2*q;
   IF w <= r THEN
     r := r-w; INC(q);
   END
 END;
 z := q; a := r;
END divide;

BEGIN
 WriteString('Enter dividend> ');
 ReadInt(a);
 WHILE a # 0 DO
   WriteString('Enter divisor> ');
   ReadInt(b);
   divide(a,b,q,r);
   WriteInt(a,3); WriteInt(b,3);
   WriteInt(q,3); WriteInt(r,3);
   WriteLn;
   WriteString('Enter dividend> ');
   ReadInt(a);
 END
END divide.