Idoneal numbers: Difference between revisions
Content added Content deleted
m (→{{header|Wren}}: Changed to Wren S/H) |
(Added PL/M) |
||
Line 1,086: | Line 1,086: | ||
1365 |
1365 |
||
1848 |
1848 |
||
</pre> |
|||
=={{header|PL/M}}== |
|||
{{works with|8080 PL/M Compiler}} ... under CP/M (or an emulator) |
|||
<syntaxhighlight lang="plm"> |
|||
100H: /* FIND IDONEAL NUMBERS - NUMBERS THAT CANNOT BE WRITTEN */ |
|||
/* AS AB + BC + AC WHERE 0 < A < B < C */ |
|||
/* THERE ARE 65 KNOWN IDONEAL NUMBERS */ |
|||
/* CP/M BDOS SYSTEM CALL AND I/O ROUTINES */ |
|||
BDOS: PROCEDURE( FN, ARG ); DECLARE FN BYTE, ARG ADDRESS; GOTO 5; END; |
|||
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; |
|||
/* TASK */ |
|||
DECLARE TRUE LITERALLY '0FFH', FALSE LITERALLY '0'; |
|||
DECLARE ( COUNT, N, A, B, C, AB, SUM ) ADDRESS; |
|||
DECLARE ( IDONEAL, FINISHED ) BYTE; |
|||
DECLARE MAX$COUNT LITERALLY '65'; |
|||
COUNT, N = 0; |
|||
DO WHILE COUNT < MAX$COUNT; |
|||
N = N + 1; |
|||
IDONEAL = TRUE; |
|||
A = 1; |
|||
DO WHILE ( A + 2 ) < N AND IDONEAL; |
|||
B = A + 1; |
|||
FINISHED = FALSE; |
|||
DO WHILE NOT FINISHED; |
|||
AB = A * B; |
|||
SUM = 0; |
|||
IF AB < N THEN DO; |
|||
C = ( N - AB ) / ( A + B ); |
|||
SUM = AB + ( C * ( B + A ) ); |
|||
IF C > B AND SUM = N THEN IDONEAL = FALSE; |
|||
B = B + 1; |
|||
END; |
|||
FINISHED = SUM > N OR NOT IDONEAL OR AB >= N; |
|||
END; |
|||
A = A + 1; |
|||
END; |
|||
IF IDONEAL THEN DO; |
|||
CALL PR$CHAR( ' ' ); |
|||
IF N < 10 THEN CALL PR$CHAR( ' ' ); |
|||
IF N < 100 THEN CALL PR$CHAR( ' ' ); |
|||
IF N < 1000 THEN CALL PR$CHAR( ' ' ); |
|||
CALL PR$NUMBER( N ); |
|||
IF ( COUNT := COUNT + 1 ) MOD 13 = 0 THEN CALL PR$NL; |
|||
END; |
|||
END; |
|||
EOF |
|||
</syntaxhighlight> |
|||
{{out}} |
|||
<pre> |
|||
1 2 3 4 5 6 7 8 9 10 12 13 15 |
|||
16 18 21 22 24 25 28 30 33 37 40 42 45 |
|||
48 57 58 60 70 72 78 85 88 93 102 105 112 |
|||
120 130 133 165 168 177 190 210 232 240 253 273 280 |
|||
312 330 345 357 385 408 462 520 760 840 1320 1365 1848 |
|||
</pre> |
</pre> |
||