题目描述
楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
输入输出样例
输入
4
输出
5
说明/提示
- 对于 60%60% 的数据 N≤50;
- 对于 100%100% 的数据,1≤N≤5000。
我们很容易看到本题的算法标签是高精度和递归,所以想要解决这道题要先学会高精度算法,以及递归算法,但本题用一般的递归反而会超时,所以我们可以用交换来代替递归,这样可以节约时间,我现在给大家写出我完全通过的代码,希望各位能够理解,并且举一反三。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int Max(int x, int y)
{
if (x > y) return x;
else
return y;
}
int main() {
int a, b, c = 1;
int numa[50500] = { 1 }, numb[50500] = { 1 }, numc[50500] = { 0 };
int arr[50500] = { 0 }, brr[50500] = { 0 };
int n;
scanf("%d", &n);
if (n >= 2) {
{
a = strlen(numa);
b = strlen(numb);
for (int i = 0;i < a;i++) {
arr[a - i] = numa[i];
}
for (int i = 0;i < b;i++) {
brr[a - i] = numb[i];
}//倒序储存,方便进行高精度计算
while (n > 1) {
c = Max(a, b) + 1;
for (int i = 0;i <= c;i++) {
numc[i] += arr[i] + brr[i];
numc[i + 1] = numc[i] / 10;
numc[i] = numc[i] % 10;
}//高精度加法
for (int i = 0;i <= c;i++) {
arr[i] = brr[i];
}//转换赋值
for (int i = 0;i <= c;i++) {
brr[i] = numc[i];
}a = 10000;
b = 10000;//给一个较大的数方便后续遍及所以得数
n--;
}
}while(numc[c] == 0&&c>0)
c--;//确保首位打印出来后不是0.
for (int i = c;i > 0;i--) {
printf("%lld", numc[i]);
}
}
else
printf("1");//保证其n=1时,可以输出一个值
return 0;
}
这个代码可能看起来有些繁琐,但可以在短时间内理解,应该可以进一步优化,就看看你的思考喽。希望一键三连哦
本文介绍了一个用C语言实现的楼梯阶数走法计算程序,利用高精度和数组交换优化了递归算法,适用于N≤5000的阶数。
499

被折叠的 条评论
为什么被折叠?



