RosettaCodeData/Task/Abundant-odd-numbers/Modula-2/abundant-odd-numbers.mod2
2026-04-30 12:34:36 -04:00

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.