RosettaCodeData/Task/Juggler-sequence/PascalABC.NET/juggler-sequence.pas

47 lines
1021 B
ObjectPascal

function isqrt(x: biginteger): biginteger;
begin
var q := 1bi;
result := 0bi;
while q <= x do
q := q shl 2;
while q > 1 do
begin
q := q shr 2;
var t := x - result - q;
result := result shr 1;
if t >= 0 Then
begin
x := t;
result += q;
end;
end;
end;
procedure juggler(k: biginteger; countdig: boolean := True);
begin
var m := k;
var maxj := k;
var maxjpos := 0;
for var i := 1 to 1000 do
begin
m := if m mod 2 = 0 then isqrt(m) else isqrt(m * m * m);
if m >= maxj then
(maxj, maxjpos) := (m, i);
if m = 1 then
begin
writeln(k:9, i:6, maxjpos:6, ' ', (if countdig then maxj.ToString.Length else maxj):20
, if countdig then ' digits, ' + milliseconds.ToString + ' ms' else '');
exit;
end;
end;
end;
begin
writeln(' n l(n) i(n) h(n) or d(n)');
for var k := 20 to 39 do
juggler(k, False);
foreach var k in [113, 173, 193, 2183, 11229, 15065, 15845, 30817] do
juggler(k)
end.