题目描述
楼梯有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.