Tau function: Difference between revisions

Add PL/M
(Add PL/I)
(Add PL/M)
Line 1,330:
5 4 2 12 4 4 4 8 2 12 4 6 4 4 4 12 2 6 6 9</pre>
 
 
=={{header|PL/M}}==
{{trans|C}}
<lang plm>100H:
 
/* CP/M BDOS FUNCTIONS */
BDOS: PROCEDURE(F,A); DECLARE F BYTE, A ADDRESS; GO TO 5; END BDOS;
EXIT: PROCEDURE; GO TO 0; END EXIT;
PR$CHAR: PROCEDURE(C); DECLARE C BYTE; CALL BDOS(2,C); END PR$CHAR;
PR$STR: PROCEDURE(S); DECLARE S ADDRESS; CALL BDOS(9,S); END PR$STR;
 
/* PRINT BYTE IN A 3-CHAR COLUMN */
PRINT3: PROCEDURE(N);
DECLARE (N, M) BYTE;
M = 100;
DO WHILE M>0;
IF N>=M
THEN CALL PR$CHAR('0' + (N/M) MOD 10);
ELSE CALL PR$CHAR(' ');
M = M/10;
END;
END PRINT3;
 
/* TAU FUNCTION */
TAU: PROCEDURE(N) BYTE;
DECLARE (N, TOTAL, COUNT, P) BYTE;
TOTAL = 1;
DO WHILE NOT N;
N = SHR(N,1);
TOTAL = TOTAL + 1;
END;
P = 3;
DO WHILE P*P <= N;
COUNT = 1;
DO WHILE N MOD P = 0;
COUNT = COUNT + 1;
N = N / P;
END;
TOTAL = TOTAL * COUNT;
P = P + 2;
END;
IF N>1 THEN TOTAL = SHL(TOTAL, 1);
RETURN TOTAL;
END TAU;
 
/* PRINT TAU 1..100 */
DECLARE N BYTE;
DO N=1 TO 100;
CALL PRINT3(TAU(N));
IF N MOD 20=0 THEN CALL PR$STR(.(13,10,'$'));
END;
CALL EXIT;
EOF</lang>
{{out}}
<pre> 1 2 2 3 2 4 2 4 3 4 2 6 2 4 4 5 2 6 2 6
4 4 2 8 3 4 4 6 2 8 2 6 4 4 4 9 2 4 4 8
2 8 2 6 6 4 2 10 3 6 4 6 2 8 4 8 4 4 2 12
2 4 6 7 4 8 2 6 4 8 2 12 2 4 6 6 4 8 2 10
5 4 2 12 4 4 4 8 2 12 4 6 4 4 4 12 2 6 6 9</pre>
 
=={{header|PureBasic}}==
2,094

edits