71 lines
1.5 KiB
Text
71 lines
1.5 KiB
Text
BEGIN
|
|
|
|
% COMPUTE P MOD Q %
|
|
INTEGER FUNCTION MOD (P, Q);
|
|
INTEGER P, Q;
|
|
BEGIN
|
|
MOD := P - Q * (P / Q);
|
|
END;
|
|
|
|
% COUNT, AND OPTIONALLY DISPLAY, PROPER DIVISORS OF N %
|
|
INTEGER FUNCTION DIVISORS(N, DISPLAY);
|
|
INTEGER N, DISPLAY;
|
|
BEGIN
|
|
INTEGER I, LIMIT, COUNT, START, DELTA;
|
|
IF MOD(N, 2) = 0 THEN
|
|
BEGIN
|
|
START := 2;
|
|
DELTA := 1;
|
|
END
|
|
ELSE % ONLY NEED TO CHECK ODD DIVISORS %
|
|
BEGIN
|
|
START := 3;
|
|
DELTA := 2;
|
|
END;
|
|
% 1 IS A DIVISOR OF ANY NUMBER > 1 %
|
|
IF N > 1 THEN COUNT := 1 ELSE COUNT := 0;
|
|
IF (DISPLAY <> 0) AND (COUNT <> 0) THEN WRITEON(1);
|
|
% CHECK REMAINING POTENTIAL DIVISORS %
|
|
I := START;
|
|
LIMIT := N / START;
|
|
WHILE I <= LIMIT DO
|
|
BEGIN
|
|
IF MOD(N, I) = 0 THEN
|
|
BEGIN
|
|
IF DISPLAY <> 0 THEN WRITEON(I);
|
|
COUNT := COUNT + 1;
|
|
END;
|
|
I := I + DELTA;
|
|
IF COUNT = 1 THEN LIMIT := N / I;
|
|
END;
|
|
DIVISORS := COUNT;
|
|
END;
|
|
|
|
COMMENT MAIN PROGRAM BEGINS HERE;
|
|
INTEGER I, NDIV, TRUE, FALSE, HIGHDIV, HIGHNUM;
|
|
TRUE := -1;
|
|
FALSE := 0;
|
|
|
|
WRITE("PROPER DIVISORS OF FIRST TEN NUMBERS:");
|
|
FOR I := 1 STEP 1 UNTIL 10 DO
|
|
BEGIN
|
|
WRITE(I, " : ");
|
|
NDIV := DIVISORS(I, TRUE);
|
|
END;
|
|
|
|
WRITE("SEARCHING FOR NUMBER UP TO 10000 WITH MOST DIVISORS ...");
|
|
HIGHDIV := 1;
|
|
HIGHNUM := 1;
|
|
FOR I := 1 STEP 1 UNTIL 10000 DO
|
|
BEGIN
|
|
NDIV := DIVISORS(I, FALSE);
|
|
IF NDIV > HIGHDIV THEN
|
|
BEGIN
|
|
HIGHDIV := NDIV;
|
|
HIGHNUM := I;
|
|
END;
|
|
END;
|
|
WRITE("THE NUMBER IS:", HIGHNUM);
|
|
WRITE("IT HAS", HIGHDIV, " DIVISORS");
|
|
|
|
END
|