Description
斐波拉契(Fibonacci)的数列如下形式,输出Fibonacci的第N(1<=N<=200)项。
1 1 2 3 5 8 13 21 34 55 ….
Input
Output
Sample Input
10
Sample Output
55
Source
elba
题解:
本题就是数学题,模拟即可,不过因为第200个菲波拉契数的大小过大,于是便考虑到了高精度
科普(斐波拉契数的规律):
第1个数固定为1,接下来的数的规律为:a[i]:=a[i-1]+a[i-2] (至于a[2]=1,是因为f[0]不存在,为0,所以1+0=1)
var
a:array[1..250]of string;
n,i:longint;
function jia(s1,s2:string):string;//高精度
var
a,b,c:array[1..10000] of longint;
i,j,len1,len2,len3,t,g:longint;
s,ss:string;
p:boolean;
begin
ss:='';
p:=false;//用来判断高精度数前面的‘0’(不知为何,高精度加法的程序是对的,但就是会在字符串前面加'0')
len2:=length(s2);
len1:=length(s1);
for i:=1 to len1 do a[len1-i+1]:=ord(s1[i])-ord('0');
for i:=1 to len2 do b[len2-i+1]:=ord(s2[i])-ord('0');
i:=1;
while (i<=len1) or (i<=len2) or (i<=len3)do
begin
if len3<i then len3:=i;
t:=a[i]+b[i]+g;
c[i]:=t mod 10;
g:=t div 10;
if g>=1 then inc(len3);
inc(i);
end;
for i:=len3 downto 1 do
begin
if c[i]<>0 then p:=true;//取出0后面的数
str(c[i],s);//数字转字符
if (s<>'0') or (s='0') and (p)then ss:=ss+s;
end;
exit(ss);
end;
此处解释一下我高精度数前面的’0’的事情,例如a[10]=55,在字符串中它会是’055’。(而且到了更大的数时,’0’会变得更多)我的高精度函数应该是对的,所以不知道错在哪,便使用如此拙劣的办法来去掉’0’真是对不起读者了。
begin
read(n);
a[1]:='1'; a[2]:='1';//先确定固定值(如果你数组有0的话就不用放a[2]的值)
for i:=3 to n do a[i]:=jia(a[i-1],a[i-2]);//利用高精度来计算
write(a[n]);//输出
end.