Nice primes: Difference between revisions

2,592 bytes added ,  3 years ago
Added PL/M
(Added Algol 68)
(Added PL/M)
Line 957:
659 673 677 691 709 727 743 761 797 821 839
853 857 887 907 911 929 941 947 977 983 997
</pre>
 
=={{header|PL/M}}==
<lang plm>100H: /* FIND NICE PRIMES - PRIMES WHOSE DIGITAL ROOT IS ALSO PRIME */
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$NUMBER: PROCEDURE( N );
DECLARE N ADDRESS, WIDTH BYTE;
DECLARE V ADDRESS, N$STR( 6 ) BYTE, W BYTE;
V = N;
W = LAST( N$STR );
N$STR( W ) = '$';
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
DO WHILE( ( V := V / 10 ) > 0 );
N$STR( W := W - 1 ) = '0' + ( V MOD 10 );
END;
CALL PRINT$STRING( .N$STR( W ) );
END PRINT$NUMBER;
DECLARE MIN$PRIME LITERALLY '501';
DECLARE MAX$PRIME LITERALLY '999';
DECLARE DCL$PRIME LITERALLY '1000';
DECLARE FALSE LITERALLY '0';
DECLARE TRUE LITERALLY '1';
/* SIEVE THE PRIMES TO MAX$PRIME */
DECLARE ( I, S ) ADDRESS;
DECLARE PRIME ( DCL$PRIME )BYTE;
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 MAX$PRIME / 2;
IF PRIME( I ) THEN DO;
DO S = I * I TO LAST( PRIME ) BY I + I;PRIME( S ) = FALSE; END;
END;
END;
/* FIND THE NICE PRIMES */
DECLARE NICE$COUNT ADDRESS;
NICE$COUNT = 0;
DO I = MIN$PRIME TO MAX$PRIME;
IF PRIME( I ) THEN DO;
/* HAVE A PRIME */
DECLARE DIGIT$SUM BYTE, V ADDRESS;
V = I;
DIGIT$SUM = 99;
DO WHILE( DIGIT$SUM > 9 );
DIGIT$SUM = 0;
DO WHILE( V > 0 );
DIGIT$SUM = DIGIT$SUM + ( V MOD 10 );
V = V / 10;
END;
V = DIGIT$SUM;
END;
IF PRIME( DIGIT$SUM ) THEN DO;
/* THE DIGITAL ROOT IS PRIME */
NICE$COUNT = NICE$COUNT + 1;
CALL PRINT$CHAR( ' ' );
CALL PRINT$NUMBER( I );
CALL PRINT$CHAR( '(' );
CALL PRINTCHAR( DIGIT$SUM + '0' );
CALL PRINT$CHAR( ')' );
IF NICE$COUNT MOD 12 = 0 THEN DO;
CALL PRINT$STRING( .( 0DH, 0AH, '$' ) );
END;
END;
END;
END;
EOF</lang>
{{out}}
<pre>
509(5) 547(7) 563(5) 569(2) 587(2) 599(5) 601(7) 617(5) 619(7) 641(2) 653(5) 659(2)
673(7) 677(2) 691(7) 709(7) 727(7) 743(5) 761(5) 797(5) 821(2) 839(2) 853(7) 857(2)
887(5) 907(7) 911(2) 929(2) 941(5) 947(2) 977(5) 983(2) 997(7)
</pre>
 
3,044

edits