58 lines
1.4 KiB
Text
58 lines
1.4 KiB
Text
$ include "seed7_05.s7i";
|
|
|
|
const func array integer: hailstone (in var integer: n) is func
|
|
result
|
|
var array integer: hSequence is 0 times 0;
|
|
begin
|
|
while n <> 1 do
|
|
hSequence &:= n;
|
|
if odd(n) then
|
|
n := 3 * n + 1;
|
|
else
|
|
n := n div 2;
|
|
end if;
|
|
end while;
|
|
hSequence &:= n;
|
|
end func;
|
|
|
|
const func integer: hailstoneSequenceLength (in var integer: n) is func
|
|
result
|
|
var integer: sequenceLength is 1;
|
|
begin
|
|
while n <> 1 do
|
|
incr(sequenceLength);
|
|
if odd(n) then
|
|
n := 3 * n + 1;
|
|
else
|
|
n := n div 2;
|
|
end if;
|
|
end while;
|
|
end func;
|
|
|
|
const proc: main is func
|
|
local
|
|
var integer: number is 0;
|
|
var integer: length is 0;
|
|
var integer: maxLength is 0;
|
|
var integer: numberOfMaxLength is 0;
|
|
var array integer: h27 is 0 times 0;
|
|
begin
|
|
for number range 1 to 99999 do
|
|
length := hailstoneSequenceLength(number);
|
|
if length > maxLength then
|
|
maxLength := length;
|
|
numberOfMaxLength := number;
|
|
end if;
|
|
end for;
|
|
h27 := hailstone(27);
|
|
writeln("hailstone(27):");
|
|
for number range 1 to 4 do
|
|
write(h27[number] <& ", ");
|
|
end for;
|
|
write("....");
|
|
for number range length(h27) -3 to length(h27) do
|
|
write(", " <& h27[number]);
|
|
end for;
|
|
writeln(" length=" <& length(h27));
|
|
writeln("Maximum length " <& maxLength <& " at number=" <& numberOfMaxLength);
|
|
end func;
|