话不多说,先上题目:
题目描述
楼梯有 NN 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
输入输出样例
输入 #1复制
4输出 #1复制
5说明/提示
- 对于 60\%60% 的数据,N \leq 50N≤50;
- 对于 100\%100% 的数据,1 \le N \leq 50001≤N≤5000。
再贴代码:
(代码主体来自洛谷@AzureGlacier,我仅略作修改,并添加注释)
#include<stdio.h>
int n, len = 1, f[5003][5003];
void hp(int k) {
int i;
for (i = 1; i <= len; i++) {
f[k][i] = f[k - 1][i] + f[k - 2][i];
}// “1”
for (i = 1; i <= len; i++) { // “2”
if (f[k][i] >= 10) {
f[k][i + 1] += f[k][i] / 10;
f[k][i] = f[k][i] % 10;
/*第一次遇到n位数时,len的值变为n,以后再次遇上len位数,len值不发生改变*/
}
}
if (f[k][len + 1])len++;
}
int main() {
int i;
scanf("%d", &n);
f[1][1] = 1;
f[2][1] = 2;
for (i = 3; i <= n; i++)
hp(i);
/*有了len的值,我们就不再需要判断去除前导0了*/
for (i = len; i >= 1; i--) //因为是反向存储,所以我们需要逆序输出
printf("%d", f[n][i]);
return 0;
}
最后,对代码的分析:
赞赞,爱爱,mua~~