Multiplicatively perfect numbers: Difference between revisions

Added PL/M
No edit summary
(Added PL/M)
Line 461:
Counts under 50,000: MPNs = 12,074 Semi-primes = 12,110
Counts under 500,000: MPNs = 108,223 Semi-primes = 108,326
</pre>
 
=={{header|PL/M}}==
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator)
<syntaxhighlight lang="plm">
100H: /* FIND MUKTIPLICATIVELY PERFECT NUMBERS - NUMBERS WHOSE PROPER */
/* DIVISOR PRODUCT IS THE NUMBER ITSELF */
/* NOTE THIS IS EQUIVALENT TO FINDING NUMBERS WITH 3 PROPER DIVISORS */
/* SEE OEIS A007422 */
 
/* CP/M BDOS SYSTEM CALL */
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END;
/* I/O ROUTINES */
PR$CHAR: PROCEDURE( C ); DECLARE C BYTE; CALL BDOS( 2, C ); END;
PR$STRING: PROCEDURE( S ); DECLARE S ADDRESS; CALL BDOS( 9, S ); END;
PR$NL: PROCEDURE; CALL PR$CHAR( 0DH ); CALL PR$CHAR( 0AH ); END;
PR$NUMBER: PROCEDURE( N ); /* PRINTS A NUMBER IN THE MINIMUN FIELD WIDTH */
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 PR$STRING( .N$STR( W ) );
END PR$NUMBER;
 
/* FIND THE NUMBERS UP TO 500 */
 
DECLARE PDC ( 501 )ADDRESS; /* TABLE OF PROPER DIVISOR COUNTS */
DECLARE ( I, J, COUNT ) ADDRESS;
 
/* COUNT THE PROPER DIVISORS OF NUMBERS TO 500 */
DO I = 0 TO LAST( PDC ); PDC( I ) = 1; END;
DO I = 2 TO LAST( PDC );
DO J = I + I TO LAST( PDC ) BY I;
PDC( J ) = PDC( J ) + 1;
END;
END;
PDC( 1 ) = 3; /* PRETEND 1 HAS 3 PROPER DIVISORS SO IT IS INCLUDED */
 
/* SHOW YHE MULTIPLICATIVELY PERFECT NUMBERS */
COUNT = 0;
DO I = 1 TO LAST( PDC );
IF PDC( I ) = 3 THEN DO;
CALL PR$CHAR( ' ' );
IF I < 100 THEN DO;
IF I < 10 THEN CALL PR$CHAR( ' ' );
CALL PR$CHAR( ' ' );
END;
CALL PR$NUMBER( I );
IF ( COUNT := COUNT + 1 ) MOD 10 = 0 THEN CALL PR$NL;
END;
END;
 
EOF
</syntaxhighlight>
{{out}}
<pre>
1 6 8 10 14 15 21 22 26 27
33 34 35 38 39 46 51 55 57 58
62 65 69 74 77 82 85 86 87 91
93 94 95 106 111 115 118 119 122 123
125 129 133 134 141 142 143 145 146 155
158 159 161 166 177 178 183 185 187 194
201 202 203 205 206 209 213 214 215 217
218 219 221 226 235 237 247 249 253 254
259 262 265 267 274 278 287 291 295 298
299 301 302 303 305 309 314 319 321 323
326 327 329 334 335 339 341 343 346 355
358 362 365 371 377 381 382 386 391 393
394 395 398 403 407 411 413 415 417 422
427 437 445 446 447 451 453 454 458 466
469 471 473 478 481 482 485 489 493 497
</pre>
 
3,049

edits