Special divisors: Difference between revisions
Content added Content deleted
Not a robot (talk | contribs) (Add J) |
(Added PL/M) |
||
Line 399: | Line 399: | ||
73 77 79 82 83 86 88 89 93 97 99 101 103 107 109 113 121 127 |
73 77 79 82 83 86 88 89 93 97 99 101 103 107 109 113 121 127 |
||
131 137 139 143 149 151 157 163 167 169 173 179 181 187 191 193 197 199 |
131 137 139 143 149 151 157 163 167 169 173 179 181 187 191 193 197 199 |
||
</pre> |
|||
=={{header|PL/M}}== |
|||
<lang plm>100H: /* FIND NUMBERS WHOSE REVERSED DIVISORS DIVIDE THE REVERSED NUMBER */ |
|||
DECLARE TRUE LITERALLY '0FFH'; |
|||
DECLARE FALSE LITERALLY '0'; |
|||
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( .( 0DH, 0AH, '$' ) ); END; |
|||
PRINT$NUMBER: PROCEDURE( N ); |
|||
DECLARE N ADDRESS; |
|||
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; |
|||
REVERSE: PROCEDURE( N )ADDRESS; /* RETURNS THE REVERSED DIGITS OF N */ |
|||
DECLARE N ADDRESS; |
|||
DECLARE ( R, V ) ADDRESS; |
|||
R = 0; |
|||
V = N; |
|||
DO WHILE( V > 0 ); |
|||
R = ( R * 10 ) + ( V MOD 10 ); |
|||
V = V / 10; |
|||
END; |
|||
RETURN R; |
|||
END REVERSE ; |
|||
/* FIND AND SHOW THE NUMBERS UP TO 200 */ |
|||
DECLARE MAX$SD LITERALLY '199'; |
|||
DECLARE ( N, RN, SD$COUNT, D, D$MAX ) ADDRESS; |
|||
DECLARE IS$SD BYTE; |
|||
SD$COUNT = 0; |
|||
DO N = 1 TO MAX$SD; |
|||
RN = REVERSE( N ); |
|||
IS$SD = TRUE; |
|||
D = 2; D$MAX = N / 2; |
|||
DO WHILE( IS$SD AND D < D$MAX ); |
|||
IF N MOD D = 0 THEN DO; |
|||
/* HAVE A DIVISOR OF N */ |
|||
IS$SD = ( RN MOD REVERSE( D ) = 0 ); |
|||
END; |
|||
D = D + 1; |
|||
END; |
|||
IF IS$SD THEN DO; |
|||
/* ALL THE REVERSED DIVISORS OF N DIVIDE N REVERSED */ |
|||
CALL PRINT$CHAR( ' ' ); |
|||
IF N < 100 THEN DO; |
|||
CALL PRINT$CHAR( ' ' ); |
|||
IF N < 10 THEN CALL PRINT$CHAR( ' ' ); |
|||
END; |
|||
CALL PRINT$NUMBER( N ); |
|||
IF ( SD$COUNT := SD$COUNT + 1 ) MOD 10 = 0 THEN CALL PRINT$NL; |
|||
END; |
|||
END; |
|||
CALL PRINT$NL; |
|||
CALL PRINT$STRING( .'FOUND $' ); |
|||
CALL PRINT$NUMBER( SD$COUNT ); |
|||
CALL PRINT$STRING( .' ''''SPECIAL DIVISORS'''' BELOW $' ); |
|||
CALL PRINT$NUMBER( MAX$SD + 1 ); |
|||
CALL PRINT$NL; |
|||
EOF</lang> |
|||
{{out}} |
|||
<pre> |
|||
1 2 3 4 5 6 7 8 9 11 |
|||
13 17 19 22 23 26 27 29 31 33 |
|||
37 39 41 43 44 46 47 53 55 59 |
|||
61 62 66 67 69 71 73 77 79 82 |
|||
83 86 88 89 93 97 99 101 103 107 |
|||
109 113 121 127 131 137 139 143 149 151 |
|||
157 163 167 169 173 179 181 187 191 193 |
|||
197 199 |
|||
FOUND 72 ''SPECIAL DIVISORS'' BELOW 200 |
|||
</pre> |
</pre> |
||