MODULE AdditivePrimes EXPORTS Main; IMPORT SIO,Fmt; CONST Max = 500; VAR Count:CARDINAL := 0; 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 J: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; INC(J,I) END END END; END Sieve; BEGIN Sieve(); FOR N := 2 TO Max DO IF Prime[N] AND Prime[DigitSum(N)] THEN SIO.PutText(Fmt.F("%4s",Fmt.Int(N))); INC(Count); IF Count MOD 10 = 0 THEN SIO.Nl() END END END; SIO.PutText(Fmt.F("\nThere are %s additive primes less than %s.\n", Fmt.Int(Count),Fmt.Int(Max))); END AdditivePrimes.