7-4 N阶楼梯上楼问题(15 分)

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型变量才解决了这个问题,但仍然面临着不兼容的问题,所以我的算法并不算完美,不过我还是想写出来希望能对大家有所帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值