题目如下:
题目描述
楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
输入输出样例
输入 #1
4
输出 #1
5
说明/提示
- 对于 60% 的数据,N≤50;
- 对于 100%的数据,1≤N≤5000。
解析:
观察得
N=1时,有1种
N=2时,有2种
N=3时,有3种
N=4时,有5种
N=5时,有8种
N=6时,有13种
…………
显而易见,斐波那契数列
N等于100时,数极大,所以本质是高精度
代码如下:
#include <stdio.h>
int a[10000]={0};//a,b,c存放每一位数,进行轮加
int b[10000]={0};
int c[10000]={0};
int main()
{
int temp;
int k;
int wei=1;
b[0]=1;//斐波那契数列初始
c[0]=2;
int n;
int i,j;
scanf("%d",&n);
if(n==1)//1,2排除在外
{
printf("%d\n",1);
}
else if(n==2)
{
printf("%d\n",2);
}
else
{
for(k=0;k<n-2;k++)
{
for(i=0;i<wei;i++)
{
a[i]=b[i]+c[i];//先让每一位相加置于a中
}
temp=0;
for(i=0;i<wei;i++)//进位操作
{
j=a[i]+temp;
a[i]=j%10;
temp=j/10;
}
if(temp>0)//判断最后是否需要进位
{
a[i]=temp;
wei++;
}
for(i=0;i<wei;i++)//轮换
{
b[i]=c[i];
c[i]=a[i];
}
}
for(i=wei-1;i>=0;i--)
{
printf("%d",a[i]);//a,b,c均是反向存数,因此逆向输出
}
}
}