洛谷 P1255 数楼梯

题目描述

楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

输入输出格式

输入格式:
一个数字,楼梯数。

输出格式:
走的方式几种。

输入输出样例

输入样例#1:
4
输出样例#1:
5
说明

用递归会太慢,需用递推

(60% N<=50 ,100% N<=5000)

分析:由题目可得
f[i]=f[i-1]+f[i-2]
也就是斐波拉契数列。只不过是高精度而已。

注意:这题n可以是0哦!!!

代码:

const
 maxn=900;
 num=6;
 mo=1000000;
var
 a,b,c:array [1..maxn] of longint;
 n,i,numa,numb,numc:longint;
 s:string;

procedure add;
 var i,j,z,q:longint;
begin
 if numa>numb then i:=numa else i:=numb;
 z:=0;
 for j:=1 to i do
  begin
   q:=a[j]+b[j]+z;
   z:=q div mo;
   c[j]:=q mod mo;
  end;
 if z>0 then begin c[i+1]:=z; numc:=i+1; end
        else numc:=i;
end;

begin
 readln(n);
 if n=0 then begin write(0); exit; end; 
 numa:=1; numb:=1;
 a[numa]:=1; b[numb]:=1;
 for i:=2 to n do
  begin
   fillchar(c,sizeof(c),0);
   numc:=0;
   add;
   a:=b;
   numa:=numb;
   b:=c;
   numb:=numc;
  end;
 write(b[numb]);
 for i:=numb-1 downto 1 do
  begin
   str(b[i],s);
   while length(s)<num do s:='0'+s;
   write(s);
  end;
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值