题目描述
楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
- 对于 60% 的数据,𝑁≤50;
- 对于 100% 的数据,1≤𝑁≤5000。
由于当有几千级台阶时走法已经超过平常的数据范围,所以这道题需要使用高精度
#include<iostream>
using namespace std;
int arr[5005][3000]={0};//5005行代表n的个数及台阶数目,3000列代表当前台阶数目的走法数目,每一列代表一个数字位数
int lc=1;//代表当前台阶走法的数字长度为1,即只有个位数
void fun(int n)
{
for(int i=1;i<=lc;i++)
{
arr[n][i]=arr[n-1][i]+arr[n-2][i];//台阶数目符合斐波那契数列,当前台阶数目等于前两个台阶数目之和
}
for(int j=1;j<=lc;j++)
{
if(arr[n][j]>=10)
{
arr[n][j+1]=arr[n][j+1]+arr[n][j]/10;//进位,保证每个数组的数字不大于10,
arr[n][j]=arr[n][j]%10;
}
}
if(arr[n][lc+1]!=0)
{
lc++;//如果两个数字相加导致位数增加,则长度也需要相应改变
}
}
int main()
{
int n;
cin>>n;
arr[1][1]=1;
arr[2][1]=2;
for(int i=3;i<=n;i++)
{
fun(i);
}
for(int j=lc;j>=1;j--)
{
cout<<arr[n][j];
}
}
通过这道题目,我们了解了递推的思想和高精度加法,递推是由前面的已知数据推导后面未知的数据,高精度加法用数组来实现。