Special divisors: Difference between revisions

Content added Content deleted
(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>