RosettaCodeData/Task/Almost-prime/PL-M/almost-prime.plm
2023-07-01 13:44:08 -04:00

52 lines
1.1 KiB
Text

100H:
BDOS: PROCEDURE (FN, ARG); DECLARE FN BYTE, ARG ADDRESS; GO TO 5; END BDOS;
EXIT: PROCEDURE; CALL BDOS(0,0); END EXIT;
PRINT: PROCEDURE (S); DECLARE S ADDRESS; CALL BDOS(9,S); END PRINT;
PRINT$NUMBER: PROCEDURE (N);
DECLARE S (4) BYTE INITIAL ('...$');
DECLARE P ADDRESS, (N, C BASED P) BYTE;
P = .S(3);
DIGIT:
P = P - 1;
C = N MOD 10 + '0';
N = N / 10;
IF N > 0 THEN GO TO DIGIT;
CALL PRINT(P);
END PRINT$NUMBER;
KPRIME: PROCEDURE (N, K) BYTE;
DECLARE (N, K, P, F) BYTE;
F = 0;
P = 2;
DO WHILE F < K AND P*P <= N;
DO WHILE N MOD P = 0;
N = N/P;
F = F+1;
END;
P = P+1;
END;
IF N > 1 THEN F = F + 1;
RETURN F = K;
END KPRIME;
DECLARE (I, C, K) BYTE;
DO K=1 TO 5;
CALL PRINT(.'K = $');
CALL PRINT$NUMBER(K);
CALL PRINT(.':$');
C = 0;
I = 2;
DO WHILE C < 10;
IF KPRIME(I, K) THEN DO;
CALL PRINT(.' $');
CALL PRINT$NUMBER(I);
C = C+1;
END;
I = I+1;
END;
CALL PRINT(.(13,10,'$'));
END;
CALL EXIT;
EOF