7-4 N阶楼梯上楼问题(15 分)
N阶楼梯上楼问题:一次可以走两阶或一阶,问有多少种上楼方式。例如,当楼梯只有一阶时,只有一种方法;当楼梯有两阶时,可以每次跨一阶,跨两次,也可以每次跨两阶,跨一次,因此有两种方法。
输入格式:
输入包括一个整数N,(1<=N<46)。
输出格式:
输出当楼梯阶数是N时的上楼方式总数。
输入样例1:
3
输出样例1:
3
输入样例2:
4
输出样例2:
5
#include <stdio.h>
double pl(double m,double n);
double jc(double g);
int main(void)
{
long long N,one,two,flag,zong;//为了大数处理,用了long long型
double zj,num=1;//这里为了大数处理用了double型,num是方法数,因为都有全走一步的,所以每个最低为1
scanf("%lld",&N);
flag=N%2;
if(flag==0)
{
num=num+1;//如果是偶数,有一个全是偶数的方法
one=2;//分解步数,1步最少为2
two=N/2-1;//算出2步
zong=one+two;//算出总步
for(;two>0;two--,one+=2,zong=zong+1)//开始计算有二步和一步时的方法
{
zj=pl(zong,two);//用排列可以算出不同次一步和不同次二步时的次数
num=num+zj;
}
}
else//用于计算奇数阶
{
one=1;
two=(N-1)/2;
zong=two+one;
for(;two>0;two--,one+=2,zong=zong+1)
{
zj=pl(zong,two);
num=num+zj;
}
}
printf("%.0lf",num);
}
double pl(double m,double n)//定义一个求组合的函数
{
double jg;
jg=jc(m)/(jc(n)*jc(m-n));
return jg;
}
double jc(double g)//定义一个阶乘函数,以便求组合函数的使用
{
double i,c=1;
for(i=1;i<=g;i++)
c=c*i;
return c;
}
这是我自己直接设计的普通算法,没有用到递归或者一些其他高级方法,我本人不是竞赛队成员也不是资深C语言学习者,所以方法有些落后。但应该很容易理解,但愿吧,程序有一些不足之处,如大数越界问题,这是我的程序的不足之处,我最后多设立了几个double型变量才解决了这个问题,但仍然面临着不兼容的问题,所以我的算法并不算完美,不过我还是想写出来希望能对大家有所帮助。