76 lines
1.4 KiB
Plaintext
76 lines
1.4 KiB
Plaintext
MODULE SternBrocot;
|
|
FROM InOut IMPORT WriteString, WriteCard, WriteLn;
|
|
|
|
CONST Amount = 1200;
|
|
|
|
VAR stern: ARRAY [1..Amount] OF CARDINAL;
|
|
i: CARDINAL;
|
|
|
|
PROCEDURE GCD(a,b: CARDINAL): CARDINAL;
|
|
VAR c: CARDINAL;
|
|
BEGIN
|
|
WHILE b # 0 DO
|
|
c := a MOD b;
|
|
a := b;
|
|
b := c;
|
|
END;
|
|
RETURN a;
|
|
END GCD;
|
|
|
|
PROCEDURE Generate;
|
|
VAR i: CARDINAL;
|
|
BEGIN
|
|
stern[1] := 1;
|
|
stern[2] := 1;
|
|
FOR i := 2 TO Amount DIV 2 DO
|
|
stern[i*2 - 1] := stern[i] + stern[i-1];
|
|
stern[i*2] := stern[i];
|
|
END;
|
|
END Generate;
|
|
|
|
PROCEDURE FindFirst(n: CARDINAL): CARDINAL;
|
|
VAR i: CARDINAL;
|
|
BEGIN
|
|
FOR i := 1 TO Amount DO
|
|
IF stern[i] = n THEN
|
|
RETURN i;
|
|
END;
|
|
END;
|
|
END FindFirst;
|
|
|
|
PROCEDURE ShowFirst(n: CARDINAL);
|
|
BEGIN
|
|
WriteString("First");
|
|
WriteCard(n,4);
|
|
WriteString(" at ");
|
|
WriteCard(FindFirst(n), 4);
|
|
WriteLn;
|
|
END ShowFirst;
|
|
|
|
BEGIN
|
|
Generate;
|
|
|
|
WriteString("First 15 numbers:");
|
|
FOR i := 1 TO 15 DO
|
|
WriteCard(stern[i], 2);
|
|
END;
|
|
WriteLn;
|
|
|
|
FOR i := 1 TO 10 DO
|
|
ShowFirst(i);
|
|
END;
|
|
ShowFirst(100);
|
|
WriteLn;
|
|
|
|
FOR i := 2 TO Amount DO
|
|
IF GCD(stern[i-1], stern[i]) # 1 THEN
|
|
WriteString("GCD of adjacent elements not 1 at: ");
|
|
WriteCard(i-1, 4);
|
|
WriteLn;
|
|
HALT;
|
|
END;
|
|
END;
|
|
WriteString("The GCD of every pair of adjacent elements is 1.");
|
|
WriteLn;
|
|
END SternBrocot.
|