题干:
描述
N级阶梯,人可以一步走一级,也可以一步走两级,求人从阶梯底端走到顶端可以有多少种不同的走法。
输入
一个整数n,代表台阶的阶数。
输出
求人从阶梯底端走到顶端可以有多少种不同的走法,输出结果的格式为大整数.
输入样例 1
1
输出样例 1
1
输入样例 2
2
输出样例 2
2
输入样例 3
4
输出样例 3
5
解题报告:
超级楼梯这题一般都是n<40,这样在longlong范围内就可以递推出来,但是这题没给数据范围,只说整数n,并且说了输出格式为大整数,所以这题需要搞一发高精度。
AC代码:
using namespace std;
char f[5005][10005];
int wei[50005];
int f1[1000005];
int f2[1000005];
ll n;
void add(ll x,ll y) {
int p = max(wei[y],wei[x]);
for(int i = 0; i<p; i++) {
f[x][i] = ( f[x][i] + f[y][i] ) ;
f[x][i+1] += f[x][i] / 10;
f[x][i] %= 10;
}
while(f[x][p] != 0) {
f[x][p+1]+=f[x][p]/10;
f[x][p]%=10;
p++;
}
wei[x]=p;
}
int main()
{
ll n;
while(~scanf("%lld",&n)) {
memset(f,0,sizeof f);
f[1][0] = 1;
f[2][0] = 2;
wei[1]=wei[2]=1;
for(ll i = 3; i<=n; i++) {
add(i,i-1);add(i,i-2);
}
for(int i = wei[n]-1; i>=0; i--) {
printf("%1d",f[n][i]);
}
printf("\n");
}
return 0;
}