Happy numbers: Difference between revisions

Content added Content deleted
(→‎{{header|ALGOL W}}: Removed near duplicate entry)
Tag: Manual revert
(→‎{{header|ALGOL W}}: Slightly simpler version)
Line 467: Line 467:


=={{header|ALGOL W}}==
=={{header|ALGOL W}}==
<syntaxhighlight lang="algolw">begin
<syntaxhighlight lang="algolw">
% find some happy numbers %
begin % find some happy numbers: numbers whose digit-square sums become 1 %
% when repeatedly applied %
% returns true if n is happy, false otherwise; n must be >= 0 %
% returns true if n is happy, false otherwise %
logical procedure isHappy( integer value n ) ;
logical procedure isHappy ( integer value n ) ;
if n < 2 then true
else begin
% seen is used to hold the values of the cycle of the %
% digit square sums, as noted in the Batch File %
% version, we do not need a large array. The digit %
% square sum of 9 999 999 999 is 810... %
integer array seen( 0 :: 32 );
integer number, trys;
number := n;
trys := -1;
while begin
logical terminated;
integer tPos;
terminated := false;
tPos := 0;
while not terminated and tPos <= trys do begin
terminated := seen( tPos ) = number;
tPos := tPos + 1
end while_not_terminated_and_tPos_lt_trys ;
number > 1 and not terminated
end do begin
integer sum;
trys := trys + 1;
seen( trys ) := number;
sum := 0;
while number > 0 do begin
integer digit;
digit := number rem 10;
number := number div 10;
sum := sum + ( digit * digit )
end while_number_gt_0 ;
number := sum
end while_number_gt_1_and_not_terminated ;
number = 1
end isHappy ;
% print the first 8 happy numbers %
begin
begin
% the largest digit-square sun for a 9 digit number is 729: 81 * 9 %
integer happyCount, n;
happyCount := 0;
logical array seen ( 0 :: 729 );
n := 1;
integer v, dSum;
write( "first 8 happy numbers: " );
for i := 0 until 729 do seen( i ) := false;
while happyCount < 8 do begin
v := abs n;
while begin
dSum := 0;
while v not = 0 do begin
integer d;
d := v rem 10;
v := v div 10;
dSum := dSum + ( d * d )
end while_v_ne_0 ;
dSum not = 1 and not seen( dSum )
end
do begin
seen( dSum ) := true;
v := dSum
end while_not_happy_and_not_looping ;
dSum = 1
end isHappy ;
begin % find the first 8 happy numbers %
integer n, hCount;
hCount := 0;
n := 1;
while hCount < 8 do begin
if isHappy( n ) then begin
if isHappy( n ) then begin
writeon( i_w := 1, " ", n );
writeon( i_w := 1, s_w := 0, " ", n );
happyCount := happyCount + 1
hCount := hCount + 1
end if_isHappy_n ;
end if_isHappy__n ;
n := n + 1
n := n + 1
end while_happyCount_lt_8
end while_hCount_lt_10
end
end
end.
end.</syntaxhighlight>
</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
first 8 happy numbers: 1 7 10 13 19 23 28 31
1 7 10 13 19 23 28 31
</pre>
</pre>