RosettaCodeData/Task/Additive-primes/ALGOL-M/additive-primes.alg

65 lines
1.2 KiB
Plaintext

BEGIN
% RETURN N MOD M %
INTEGER FUNCTION MOD(N, M);
INTEGER N, M;
BEGIN
MOD := N - (N / M) * M;
END;
% RETURN 1 IF N IS PRIME, OTHERWISE 0 %
INTEGER FUNCTION ISPRIME(N);
INTEGER N;
BEGIN
IF N = 2 THEN
ISPRIME := 1
ELSE IF (N < 2) OR (MOD(N,2) = 0) THEN
ISPRIME := 0
ELSE % TEST ODD DIVISORS UP TO SQRT OF N %
BEGIN
INTEGER I, DIVISIBLE;
I := 3;
DIVISIBLE := 0;
WHILE (I * I <= N) AND (DIVISIBLE = 0) DO
BEGIN
IF MOD(N,I) = 0 THEN DIVISIBLE := 1;
I := I + 2;
END;
ISPRIME := 1 - DIVISIBLE;
END;
END;
% RETURN THE SUM OF THE DIGITS OF N %
INTEGER FUNCTION SUMDIGITS(N);
INTEGER N;
BEGIN
INTEGER SUM;
SUM := 0;
WHILE N > 0 DO
BEGIN
SUM := SUM + MOD(N, 10);
N := N / 10;
END;
SUMDIGITS := SUM;
END;
% LOOK FOR ADDITIVE PRIMES IN RANGE 1 TO 500 %
INTEGER I, S, COUNT;
COUNT := 0;
FOR I := 1 STEP 1 UNTIL 500 DO
BEGIN
IF ISPRIME(I)=1 THEN
BEGIN
S := SUMDIGITS(I);
IF ISPRIME(S)=1 THEN
BEGIN
WRITEON(I);
COUNT := COUNT + 1;
IF MOD(COUNT,8) = 0 THEN WRITE("");
END;
END;
END;
WRITE(COUNT," ADDITIVE PRIMES WERE FOUND");
END