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

本文介绍了一个用C语言实现的楼梯阶数走法计算程序,利用高精度和数组交换优化了递归算法,适用于N≤5000的阶数。

题目描述

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

}


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

C语言:在 LIT 综教楼后有一个深坑,关于这个坑的来历,有很多种不同的说法。其中一种说法是,在很多年以前,这个坑就已经在那里了。这种说法也被大多人认可,这是因为该坑有一种特别的结构,想要人工建造是有相当困难的。   从横截面图来看,坑底成阶梯状,由从左至右的 1..N 个的平面构成(其中 1 ≤ N ≤ 100,000),如图:    *            * :    *            * :    *            * 8    *    **      * 7    *    **      * 6    *    **      * 5    *    ********* 4 <- 高度    *    ********* 3    ************** 2    ************** 1 平面 |  1  |2|   3    | 每个平面 i 可以用两个字来描述,即它的宽度 Wi 和高度 Hi,其中 1 ≤ Wi ≤ 1,000、1 ≤ Hi ≤ 1,000,000,而这个坑最特别的地方在于坑底每个平面的高度都是不同的。每到夏天,雨水会把坑填满,而在其它的季节,则需要通过人工灌水的方式把坑填满。灌水点设在坑底位置最低的那个平面,每分钟灌水量为一个单位(即高度和宽度均为 1)。随着水位的增长,水自然会向其它平面扩散,当水将某平面覆盖且水高达到一个单位时,就认为该平面被水覆盖了。   请你计算每个平面被水覆盖的时间。输入的第一行是一个整 N,表示平面的量。从第二行开始的 N 行上分别有两个整,分别表示平面的宽度和高度。 输出   输出每个平面被水覆盖的时间。 测试输入 期待的输出 时间限制 内存限制 额外进程 测试用例 1 以文本方式显示 3↵ 4 2↵ 2 7↵ 6 4↵ 以文本方式显示 4↵ 50↵ 26↵ 1秒 1024KB 0 测试用例 12 以文本方式显示 3↵ 4 2↵ 6 4↵ 2 7↵ 以文本方式显示 4↵ 18↵ 50↵ 1秒 1024KB 0
10-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值