How to find all happy numbers in a specific range with Pascal

1 Answer

0 votes
program HappyNumbersProgram;

{
  A happy number is a number that eventually reaches 1 
  when repeatedly replaced by the sum of the squares of its digits.

  19 = 1^2 + 9^2 = 82
  19 -> 82 -> 68 -> 100 -> 1 eventually reaches 1 
  19 = happy number
}

{ Compute the sum of squares of digits of n }
function SumOfDigitSquares(n : integer) : integer;
var
  sum, d : integer;
begin
  sum := 0;
  while n > 0 do
  begin
    d := n mod 10;
    sum := sum + d * d;
    n := n div 10;
  end;
  SumOfDigitSquares := sum;
end;

{ Determine whether n is a happy number }
function IsHappy(n : integer) : boolean;
var
  seen : array[1..1000] of integer;
  count, i : integer;
  repeated : boolean;
begin
  count := 0;

  while n <> 1 do
  begin
    { check if we've seen n before }
    repeated := false;
    for i := 1 to count do
      if seen[i] = n then
      begin
        repeated := true;
        break;
      end;

    if repeated then
    begin
      IsHappy := false;  { cycle detected → not happy }
      exit;
    end;

    { record n }
    if count < 1000 then
    begin
      count := count + 1;
      seen[count] := n;
    end;

    n := SumOfDigitSquares(n);
  end;

  IsHappy := true;  { n = 1 → happy }
end;

var
  a, b, i : integer;
  happyNumbers : array[1..200] of integer;
  size : integer;

begin
  a := 1;
  b := 100;

  if a > b then
  begin
    i := a;
    a := b;
    b := i;
  end;

  size := 0;

  for i := a to b do
    if IsHappy(i) then
    begin
      size := size + 1;
      happyNumbers[size] := i;
    end;

  writeln('Happy numbers in range [', a, ', ', b, ']:');
  for i := 1 to size do
    write(happyNumbers[i], ' ');

end.


{
run:

Happy numbers in range [1, 100]:
1 7 10 13 19 23 28 31 32 44 49 68 70 79 82 86 91 94 97 100 

}

 



answered Feb 24 by avibootz
...