44 lines
852 B
Text
44 lines
852 B
Text
MODULE HappyNumbers;
|
|
FROM InOut IMPORT WriteCard, WriteLn;
|
|
|
|
CONST Amount = 8;
|
|
VAR seen, num: CARDINAL;
|
|
|
|
PROCEDURE SumDigitSquares(n: CARDINAL): CARDINAL;
|
|
VAR sum, digit: CARDINAL;
|
|
BEGIN
|
|
sum := 0;
|
|
WHILE n>0 DO
|
|
digit := n MOD 10;
|
|
n := n DIV 10;
|
|
sum := sum + digit * digit;
|
|
END;
|
|
RETURN sum;
|
|
END SumDigitSquares;
|
|
|
|
PROCEDURE Happy(n: CARDINAL): BOOLEAN;
|
|
VAR i: CARDINAL;
|
|
seen: ARRAY [0..255] OF BOOLEAN;
|
|
BEGIN
|
|
FOR i := 0 TO 255 DO
|
|
seen[i] := FALSE;
|
|
END;
|
|
REPEAT
|
|
seen[n] := TRUE;
|
|
n := SumDigitSquares(n);
|
|
UNTIL seen[n];
|
|
RETURN seen[1];
|
|
END Happy;
|
|
|
|
BEGIN
|
|
seen := 0;
|
|
num := 0;
|
|
WHILE seen < Amount DO
|
|
IF Happy(num) THEN
|
|
INC(seen);
|
|
WriteCard(num,2);
|
|
WriteLn();
|
|
END;
|
|
INC(num);
|
|
END;
|
|
END HappyNumbers.
|