55 lines
1.1 KiB
Plaintext
55 lines
1.1 KiB
Plaintext
MODULE AdditivePrimes;
|
|
FROM InOut IMPORT WriteString, WriteCard, WriteLn;
|
|
|
|
CONST
|
|
Max = 500;
|
|
|
|
VAR
|
|
N: CARDINAL;
|
|
Count: CARDINAL;
|
|
Prime: ARRAY [2..Max] OF BOOLEAN;
|
|
|
|
PROCEDURE DigitSum(n: CARDINAL): CARDINAL;
|
|
BEGIN
|
|
IF n < 10 THEN
|
|
RETURN n;
|
|
ELSE
|
|
RETURN (n MOD 10) + DigitSum(n DIV 10);
|
|
END;
|
|
END DigitSum;
|
|
|
|
PROCEDURE Sieve;
|
|
VAR i, j, max2: CARDINAL;
|
|
BEGIN
|
|
FOR i := 2 TO Max DO
|
|
Prime[i] := TRUE;
|
|
END;
|
|
|
|
FOR i := 2 TO Max DIV 2 DO
|
|
IF Prime[i] THEN;
|
|
j := i*2;
|
|
WHILE j <= Max DO
|
|
Prime[j] := FALSE;
|
|
j := j + i;
|
|
END;
|
|
END;
|
|
END;
|
|
END Sieve;
|
|
|
|
BEGIN
|
|
Count := 0;
|
|
Sieve();
|
|
FOR N := 2 TO Max DO
|
|
IF Prime[N] AND Prime[DigitSum(N)] THEN
|
|
WriteCard(N, 4);
|
|
Count := Count + 1;
|
|
IF Count MOD 10 = 0 THEN WriteLn(); END;
|
|
END;
|
|
END;
|
|
WriteLn();
|
|
WriteString('There are '); WriteCard(Count,0);
|
|
WriteString(' additive primes less than '); WriteCard(Max,0);
|
|
WriteString('.');
|
|
WriteLn();
|
|
END AdditivePrimes.
|