(* Compute the largest integer less or equal to the square foot of a given integer (due to Hoare). *) MODULE isqrt; FROM InOut IMPORT ReadCard, WriteCard, WriteLn, WriteString; VAR n,a2,b2,ab,t: CARDINAL; BEGIN WriteString('Enter n> '); ReadCard(n); WriteLn; WHILE n > 0 DO a2 := 0; ab :=0; b2 := 1; WriteString('n = '); WriteCard(n,4); WriteLn; WHILE b2 <= n DO b2 := 4*b2 END; WHILE b2 # 1 DO ab := ab DIV 2; b2 := b2 DIV 4; t := a2 + 2*ab + b2; IF t <= n THEN a2 := t; ab := ab+b2; END END; WriteCard(a2,4); WriteCard(ab,4); WriteCard(b2,4); WriteLn; WriteString('Enter n> '); ReadCard(n); WriteLn; END END isqrt.