41 lines
1.1 KiB
Ada
41 lines
1.1 KiB
Ada
with Ada.Text_IO; use Ada.Text_IO;
|
|
with Ada.Containers.Ordered_Sets;
|
|
|
|
procedure Test_Happy_Digits is
|
|
function Is_Happy (N : Positive) return Boolean is
|
|
package Sets_Of_Positive is new Ada.Containers.Ordered_Sets (Positive);
|
|
use Sets_Of_Positive;
|
|
function Next (N : Positive) return Natural is
|
|
Sum : Natural := 0;
|
|
Accum : Natural := N;
|
|
begin
|
|
while Accum > 0 loop
|
|
Sum := Sum + (Accum mod 10) ** 2;
|
|
Accum := Accum / 10;
|
|
end loop;
|
|
return Sum;
|
|
end Next;
|
|
Current : Positive := N;
|
|
Visited : Set;
|
|
begin
|
|
loop
|
|
if Current = 1 then
|
|
return True;
|
|
elsif Visited.Contains (Current) then
|
|
return False;
|
|
else
|
|
Visited.Insert (Current);
|
|
Current := Next (Current);
|
|
end if;
|
|
end loop;
|
|
end Is_Happy;
|
|
Found : Natural := 0;
|
|
begin
|
|
for N in Positive'Range loop
|
|
if Is_Happy (N) then
|
|
Put (Integer'Image (N));
|
|
Found := Found + 1;
|
|
exit when Found = 8;
|
|
end if;
|
|
end loop;
|
|
end Test_Happy_Digits;
|