Требуется найти n-ое число Фибоначчи. Напомним, что последовательность Фибоначчи это:
F(1) = 1; F(2) = 1; F(n) = F(n - 1) + F(n - 2);
на вход n. при том ,что n до 15000
const
_maxdig = 1000;
_osn = 10000;
type
Tlong = array[0.._maxdig]of integer;
Plong = ^Tlong;
Procedure InitOne(a: PLong);
Begin
a^[1] := 1; inc(a^[0]);
End;
procedure SumLongTwo(a,b,c:Plong);
var i,k:integer;
begin
fillchar(c^,sizeof(c^),0);
if a^[0]>b^[0] then k:=a^[0] else k:=b^[0];
for i:=1 to k do
begin
c^[i+1]:=(c^[i]+a^[i]+b^[i]) div _osn;
c^[i]:=(c^[i]+a^[i]+b^[i]) mod _osn;
end;
if c^[k+1]=0 then c^[0]:=k else c^[0]:=k+1;
end;
procedure WriteLong(var f:text;a:Plong);
var ls,s:string;
i:integer;
begin
str(_osn div 10,ls);
write(f,a^[a^[0]]);
for i:=a^[0]-1 downto 1 do
begin
str(a^[i],s);
while length(s)<length(ls) do s:='0'+s;
write(f,s);
end;
writeln(f);
end;
var
Great_1, Great_2, Great_3: TLong;
first, second, next: PLong;
n, max: integer;
begin
Write('n = '); ReadLn(max);
first := @Great_1;
second := @Great_2;
next := @Great_3;
InitOne(First); { First := 1 }
InitOne(Second); { Second := 1 }
n := 2;
repeat
Inc(n);
SumLongTwo(First, Second, Next); { next := first + second }
First^ := Second^;
Second^ := Next^;
until n >= max;
Write('n = ', n, ' : ');
WriteLong(Output, Next);
end.