Happy numbers: Difference between revisions

→‎{{header|ALGOL W}}: Slightly simpler version
(→‎{{header|ALGOL W}}: Removed near duplicate entry)
Tag: Manual revert
(→‎{{header|ALGOL W}}: Slightly simpler version)
Line 467:
 
=={{header|ALGOL W}}==
<syntaxhighlight lang="algolw">begin
begin % find some happy numbers: numbers whose digit-square sums become 1 %
% printwhen repeatedly applied the first 8 happy numbers %
% returns true if n is happy, false otherwise; n must be >= 0 %
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
% the %largest digit -square sums,sun asfor noteda in9 the Batchdigit Filenumber is 729: 81 * 9 %
integer happyCount, n;
happyCountlogical :=array seen ( 0 :: 729 );
ninteger v, := 1dSum;
write(for "firsti 8:= happy0 numbers:until "729 do seen( i ) := false;
whilev happyCount < 8 do:= beginabs n;
while begin
logicaldSum terminated:= 0;
while v not terminated and tPos <= trys0 do begin
integer tPosd;
trys d := v rem := -110;
terminated v := falsev div 10;
tPos dSum := dSum + ( d * :=d 0;)
integerend while_v_ne_0 sum;
dSum not = 1 terminatedand :=not seen( tPosdSum ) = number;
if n < 2 then true end
elsedo begin
integer array seen( 0dSum ) ::= 32 )true;
number v := n;dSum
end while_not_happy_and_not_looping ;
numberdSum = 1
end isHappy ;
begin % find the first 8 happy numbers %
integer numbern, tryshCount;
hCount := 0;
tPos n := tPos + 1;
while hCount < end8 do begin
if isHappy( n ) then begin
writeon( i_w := 1, s_w := 0, " ", n );
happyCounthCount := happyCounthCount + 1
end if_isHappy_nif_isHappy__n ;
n := n + 1
end while_happyCount_lt_8while_hCount_lt_10
end
end.
end.</syntaxhighlight>
{{out}}
<pre>
first 8 happy numbers: 1 7 10 13 19 23 28 31
</pre>
 
3,025

edits