52 lines
1.2 KiB
Text
52 lines
1.2 KiB
Text
MODULE MagnanimousNumbers;
|
|
FROM InOut IMPORT WriteString, WriteCard, WriteLn;
|
|
|
|
VAR n, i: CARDINAL;
|
|
|
|
PROCEDURE prime(n: CARDINAL): BOOLEAN;
|
|
VAR d: CARDINAL;
|
|
BEGIN
|
|
IF n<2 THEN RETURN FALSE END;
|
|
IF n MOD 2 = 0 THEN RETURN n = 2 END;
|
|
IF n MOD 3 = 0 THEN RETURN n = 3 END;
|
|
d := 5;
|
|
WHILE d*d <= n DO
|
|
IF n MOD d = 0 THEN RETURN FALSE END;
|
|
INC(d, 2);
|
|
IF n MOD d = 0 THEN RETURN FALSE END;
|
|
INC(d, 4)
|
|
END;
|
|
RETURN TRUE
|
|
END prime;
|
|
|
|
PROCEDURE magnanimous(n: CARDINAL): BOOLEAN;
|
|
VAR left, right, shift: CARDINAL;
|
|
BEGIN
|
|
left := n;
|
|
right := 0;
|
|
shift := 1;
|
|
WHILE left >= 10 DO
|
|
INC(right, (left MOD 10) * shift);
|
|
shift := shift * 10;
|
|
left := left DIV 10;
|
|
IF NOT prime(left + right) THEN RETURN FALSE END
|
|
END;
|
|
RETURN TRUE
|
|
END magnanimous;
|
|
|
|
BEGIN
|
|
n := 0;
|
|
FOR i := 1 TO 250 DO
|
|
WHILE NOT magnanimous(n) DO INC(n) END;
|
|
|
|
IF i=1 THEN WriteString("1 - 45:"); WriteLn
|
|
ELSIF i=240 THEN WriteString("241 - 250:"); WriteLn
|
|
END;
|
|
|
|
IF (i <= 45) OR (i > 240) THEN
|
|
WriteCard(n, 7);
|
|
IF i MOD 5 = 0 THEN WriteLn END
|
|
END;
|
|
INC(n)
|
|
END
|
|
END MagnanimousNumbers.
|