(ssl1244)斐波拉契数列

斐波拉契数列

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值