60 lines
1.3 KiB
Text
60 lines
1.3 KiB
Text
$ include "seed7_05.s7i";
|
|
include "bigint.s7i";
|
|
|
|
const func bigInteger: min (in bigInteger: a, in bigInteger: b, in bigInteger: c) is func
|
|
result
|
|
var bigInteger: min is 0_;
|
|
begin
|
|
if a < b then
|
|
min := a;
|
|
else
|
|
min := b;
|
|
end if;
|
|
if c < min then
|
|
min := c;
|
|
end if;
|
|
end func;
|
|
|
|
const func bigInteger: hamming (in integer: n) is func
|
|
result
|
|
var bigInteger: hammingNum is 1_;
|
|
local
|
|
var array bigInteger: hammingNums is 0 times 0_;
|
|
var integer: index is 0;
|
|
var bigInteger: x2 is 2_;
|
|
var bigInteger: x3 is 3_;
|
|
var bigInteger: x5 is 5_;
|
|
var integer: i is 1;
|
|
var integer: j is 1;
|
|
var integer: k is 1;
|
|
begin
|
|
hammingNums := n times 1_;
|
|
for index range 2 to n do
|
|
hammingNum := min(x2, x3, x5);
|
|
hammingNums[index] := hammingNum;
|
|
if x2 = hammingNum then
|
|
incr(i);
|
|
x2 := 2_ * hammingNums[i];
|
|
end if;
|
|
if x3 = hammingNum then
|
|
incr(j);
|
|
x3 := 3_ * hammingNums[j];
|
|
end if;
|
|
if x5 = hammingNum then
|
|
incr(k);
|
|
x5 := 5_ * hammingNums[k];
|
|
end if;
|
|
end for;
|
|
end func;
|
|
|
|
const proc: main is func
|
|
local
|
|
var integer: n is 0;
|
|
begin
|
|
for n range 1 to 20 do
|
|
write(hamming(n) <& " ");
|
|
end for;
|
|
writeln;
|
|
writeln(hamming(1691));
|
|
writeln(hamming(1000000));
|
|
end func;
|