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> |
||