80 lines
1.8 KiB
Text
80 lines
1.8 KiB
Text
MODULE AbundantOdd;
|
|
(* Abundant odd numbers *)
|
|
FROM SWholeIO IMPORT
|
|
WriteInt;
|
|
FROM STextIO IMPORT
|
|
WriteLn, WriteString;
|
|
FROM RealMath IMPORT
|
|
sqrt;
|
|
|
|
VAR
|
|
OddNumber, ACount, DSum: CARDINAL;
|
|
Found: BOOLEAN;
|
|
|
|
PROCEDURE DivisorSum(N: CARDINAL): CARDINAL;
|
|
VAR
|
|
D, OtherD, Sum: CARDINAL;
|
|
BEGIN
|
|
Sum := 1;
|
|
FOR D := 2 TO TRUNC(sqrt(FLOAT(N))) DO
|
|
IF N MOD D = 0 THEN
|
|
Sum := Sum + D;
|
|
OtherD := N DIV D;
|
|
IF OtherD <> D THEN
|
|
Sum := Sum + OtherD
|
|
END;
|
|
END;
|
|
END;
|
|
RETURN Sum
|
|
END DivisorSum;
|
|
|
|
BEGIN
|
|
(* First 25 odd abundant numbers *)
|
|
OddNumber := 1;
|
|
ACount := 0;
|
|
DSum := 0;
|
|
WriteString("The first 25 abundant odd numbers:");
|
|
WriteLn;
|
|
WHILE ACount < 25 DO
|
|
DSum := DivisorSum(OddNumber);
|
|
IF DSum > OddNumber THEN
|
|
ACount := ACount + 1;
|
|
WriteInt(OddNumber, 6);
|
|
WriteString(" proper divisor sum: ");
|
|
WriteInt(DSum, 6);
|
|
WriteLn
|
|
END;
|
|
OddNumber := OddNumber + 2
|
|
END;
|
|
(* 1000th odd abundant number *)
|
|
WHILE ACount < 1000 DO
|
|
DSum := DivisorSum(OddNumber);
|
|
IF DSum > OddNumber THEN
|
|
ACount := ACount + 1
|
|
END;
|
|
OddNumber := OddNumber + 2
|
|
END;
|
|
WriteString("1000th abundant odd number:");
|
|
WriteLn;
|
|
WriteString(" ");
|
|
WriteInt(OddNumber - 2, 1);
|
|
WriteString(" proper divisor sum: ");
|
|
WriteInt(DSum, 1);
|
|
WriteLn;
|
|
(* First odd abundant number > 1000000000 *)
|
|
OddNumber := 1000000001;
|
|
Found := FALSE;
|
|
WHILE NOT Found DO
|
|
DSum := DivisorSum(OddNumber);
|
|
IF DSum > OddNumber THEN
|
|
Found := TRUE;
|
|
WriteString("First abundant odd number > 1 000 000 000:");
|
|
WriteLn;
|
|
WriteString(" ");
|
|
WriteInt(OddNumber, 1);
|
|
WriteString(" proper divisor sum: ");
|
|
WriteInt(DSum, 1);
|
|
END;
|
|
OddNumber := OddNumber + 2
|
|
END;
|
|
END AbundantOdd.
|