Numbers whose binary and ternary digit sums are prime: Difference between revisions
Content added Content deleted
(→{{header|PL/M}}: Added syntax highlighting and "See Also"; Added PL/I) |
(Added Polyglot:PL/I and PL/M) |
||
Line 1,180: | Line 1,180: | ||
<pre> |
<pre> |
||
61 numbers found: {5,6,7,10,11,"...",181,185,191,193,199} |
61 numbers found: {5,6,7,10,11,"...",181,185,191,193,199} |
||
</pre> |
|||
=={{header|Polyglot:PL/I and PL/M}}== |
|||
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator) |
|||
Should work with many PL/I implementations. |
|||
<br> |
|||
The PL/I include file "pg.inc" can be found on the [[Polyglot:PL/I and PL/M]] page. |
|||
Note the use of text in column 81 onwards to hide the PL/I specifics from the PL/M compiler. |
|||
<lang pli>/* FIND NUMBERS WHOSE DIGIT SUM SQUARED AND CUBED IS PRIME */ |
|||
prime_digit_sums_100H: procedure options (main); |
|||
/* PL/I DEFINITIONS */ |
|||
%include 'pg.inc'; |
|||
/* PL/M DEFINITIONS: CP/M BDOS SYSTEM CALL AND CONSOLE I/O ROUTINES, ETC. */ /* |
|||
DECLARE BINARY LITERALLY 'ADDRESS', CHARACTER LITERALLY 'BYTE'; |
|||
DECLARE FIXED LITERALLY ' ', BIT LITERALLY 'BYTE'; |
|||
DECLARE STATIC LITERALLY ' ', RETURNS LITERALLY ' '; |
|||
DECLARE FALSE LITERALLY '0', TRUE LITERALLY '1'; |
|||
DECLARE HBOUND LITERALLY 'LAST', SADDR LITERALLY '.'; |
|||
BDOSF: PROCEDURE( FN, ARG )BYTE; |
|||
DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END; |
|||
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END; |
|||
PRCHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END; |
|||
PRSTRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END; |
|||
PRNL: PROCEDURE; CALL PRCHAR( 0DH ); CALL PRCHAR( 0AH ); END; |
|||
PRNUMBER: PROCEDURE( N ); |
|||
DECLARE N ADDRESS; |
|||
DECLARE V ADDRESS, N$STR( 6 ) BYTE, W BYTE; |
|||
N$STR( W := LAST( N$STR ) ) = '$'; |
|||
N$STR( W := W - 1 ) = '0' + ( ( V := N ) MOD 10 ); |
|||
DO WHILE( ( V := V / 10 ) > 0 ); |
|||
N$STR( W := W - 1 ) = '0' + ( V MOD 10 ); |
|||
END; |
|||
CALL BDOS( 9, .N$STR( W ) ); |
|||
END PRNUMBER; |
|||
MODF: PROCEDURE( A, B )ADDRESS; |
|||
DECLARE ( A, B )ADDRESS; |
|||
RETURN( A MOD B ); |
|||
END MODF; |
|||
/* END LANGUAGE DEFINITIONS */ |
|||
/* TASK */ |
|||
DIGITSUM: PROCEDURE( N, BASE )RETURNS /* RETURNS THE DIGIT SUM OF N */ ( |
|||
FIXED BINARY /* IN THE SPECIFIED BASE */ ) |
|||
; |
|||
DECLARE ( N, BASE ) FIXED BINARY; |
|||
DECLARE ( SUM, V ) FIXED BINARY; |
|||
SUM = MODF( N, BASE ); |
|||
V = N / BASE; |
|||
DO WHILE( V > 0 ); |
|||
SUM = SUM + MODF( V, BASE ); |
|||
V = V / BASE; |
|||
END; |
|||
RETURN( SUM ); |
|||
END DIGITSUM ; |
|||
ISPRIME: PROCEDURE( N )RETURNS /* RETURNS TRUE IF N IS PRIME, */ ( |
|||
BIT /* FALSE OTHERWISE */ ) |
|||
; |
|||
DECLARE N FIXED BINARY; |
|||
DECLARE I FIXED BINARY; |
|||
DECLARE RESULT BIT; |
|||
IF N < 2 THEN RESULT = FALSE; |
|||
ELSE IF N = 2 THEN RESULT = TRUE; |
|||
ELSE IF MODF( N, 2 ) = 0 THEN RESULT = FALSE; |
|||
ELSE DO; |
|||
RESULT = TRUE; |
|||
I = 3; |
|||
DO WHILE( RESULT & /* |
|||
AND /* */ ( I * I ) <= N ); |
|||
RESULT = MODF( N, I ) > 0; |
|||
I = I + 2; |
|||
END; |
|||
END; |
|||
RETURN( RESULT ); |
|||
END ISPRIME ; |
|||
DECLARE ( I, PCOUNT ) FIXED BINARY; |
|||
PCOUNT = 0; |
|||
DO I = 1 TO 199; |
|||
IF ISPRIME( DIGITSUM( I, 2 ) ) THEN DO; |
|||
IF ISPRIME( DIGITSUM( I, 3 ) ) THEN DO; |
|||
CALL PRCHAR( ' ' ); |
|||
IF I < 10 THEN CALL PRCHAR( ' ' ); |
|||
IF I < 100 THEN CALL PRCHAR( ' ' ); |
|||
CALL PRNUMBER( I ); |
|||
PCOUNT = PCOUNT + 1; |
|||
IF PCOUNT > 9 THEN DO; |
|||
PCOUNT = 0; |
|||
CALL PRNL; |
|||
END; |
|||
END; |
|||
END; |
|||
END; |
|||
EOF: end prime_digit_sums_100H;</lang> |
|||
{{out}} |
|||
<pre> |
|||
5 6 7 10 11 12 13 17 18 19 |
|||
21 25 28 31 33 35 36 37 41 47 |
|||
49 55 59 61 65 67 69 73 79 82 |
|||
84 87 91 93 97 103 107 109 115 117 |
|||
121 127 129 131 133 137 143 145 151 155 |
|||
157 162 167 171 173 179 181 185 191 193 |
|||
199 |
|||
</pre> |
</pre> |
||