Additive primes: Difference between revisions

Content deleted Content added
Added PL/M
Line 615: Line 615:
<pre>
<pre>
54 additive primes found: 2 3 5 7 11 23 ... 443 449 461 463 467 487
54 additive primes found: 2 3 5 7 11 23 ... 443 449 461 463 467 487
</pre>

=={{header|PL/M}}==
<lang plm>100H: /* FIND ADDITIVE PRIMES - PRIMES WHOSE DIGIT SUM IS ALSO PRIME */

DECLARE CR LITERALLY '0DH';
DECLARE LF LITERALLY '0AH';

BDOS: PROCEDURE( FN, ARG ); /* CP/M BDOS SYSTEM CALL */
DECLARE FN BYTE, ARG ADDRESS;
GOTO 5;
END BDOS;
PRINT$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END;
PRINT$STRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END;
PRINT$NL: PROCEDURE; CALL PRINT$STRING( .( CR, LF, '$' ) ); END;
PRINT$NUMBER: PROCEDURE( N, WIDTH );
DECLARE N ADDRESS, WIDTH BYTE;
DECLARE V ADDRESS, N$STR( 6 ) BYTE, ( N$POS, W ) BYTE;
V = N; W = WIDTH + 1;
N$STR( W ) = '$';
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
DO WHILE( W > 0 );
W = W - 1;
V = V / 10;
IF V = 0 THEN N$STR( W ) = ' ';
ELSE N$STR( W ) = '0' + ( V MOD 10 );
END;
CALL PRINT$STRING( .N$STR( W + 1 ) );
END PRINT$NUMBER;

DECLARE MAX$PRIME LITERALLY '501';
DECLARE FALSE LITERALLY '0';
DECLARE TRUE LITERALLY '1';
DECLARE PRIME( MAX$PRIME ) BYTE; /* ELEMENT 0 IS UNUSED */
DECLARE ( A$COUNT, I, J ) ADDRESS;
/* SIEVE THE PRIMES UP TO MAX$PRIME */
PRIME( 1 ) = FALSE; PRIME( 2 ) = TRUE;
DO I = 3 TO LAST( PRIME ) BY 2; PRIME( I ) = TRUE; END;
DO I = 4 TO LAST( PRIME ) BY 2; PRIME( I ) = FALSE; END;
DO I = 3 TO LAST( PRIME ) / 2 BY 2;
IF PRIME( I ) THEN DO;
DO J = I * I TO LAST( PRIME ) BY I; PRIME( J ) = FALSE; END;
END;
END;
/* FIND THE PRIMES THAT ARE ADDATIVE PRIMES */
A$COUNT = 0;
DO I = 1 TO LAST( PRIME );
IF PRIME( I ) THEN DO;
DECLARE D$SUM BYTE, V ADDRESS;
V = I;
D$SUM = 0;
DO WHILE V > 0;
D$SUM = D$SUM + ( V MOD 10 );
V = V / 10;
END;
IF PRIME( D$SUM ) THEN DO;
CALL PRINT$NUMBER( I, 4 );
A$COUNT = A$COUNT + 1;
IF A$COUNT MOD 12 = 0 THEN CALL PRINT$NL;
END;
END;
END;
CALL PRINT$NL;
CALL PRINT$NUMBER( A$COUNT, 4 );
CALL PRINT$STRING( .' ADDITIVE PRIMES FOUND BELOW$' );
CALL PRINT$NUMBER( LAST( PRIME ), 4 );
CALL PRINT$NL;
EOF
</lang>
{{out}}
<pre>
2 3 5 7 11 23 29 41 43 47 61 67
83 89 101 113 131 137 139 151 157 173 179 191
193 197 199 223 227 229 241 263 269 281 283 311
313 317 331 337 353 359 373 379 397 401 409 421
443 449 461 463 467 487
54 ADDITIVE PRIMES FOUND BELOW 500
</pre>
</pre>