洛谷--数阶梯(完全通过版)

题目描述

楼梯有 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;

}


这个代码可能看起来有些繁琐,但可以在短时间内理解,应该可以进一步优化,就看看你的思考喽。希望一键三连哦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值