P1255 数楼梯

题目描述

楼梯有 NN 阶,上楼可以一步上一阶,也可以一步上二阶。

编一个程序,计算共有多少种不同的走法。

输入格式

一个数字,楼梯数。

输出格式

输出走的方式总数。

输入输出样例

输入 #1
4
输出 #1
5

说明/提示

  • 对于 60\%60% 的数据,N \leq 50N50;
  • 对于 100\%100% 的数据,1 \le N \leq 50001N5000。

思路:每一个台阶的走法数量,都来自它前边两个台阶的走法数量加起来的和,既可以用递推也可以用递归,在这里建议大家能用递归的时候尽量用递归,因为后边的很多重要算法都是以递归为基础的,早早培养递归思维可以为以后的学习打好基础。中学时代的时间极其宝贵稀少,高精加减乘除运算直接跳过,把封装好的高精运算方法直接强记下来,考试时候直接用就行。

 

第一种解法:用python语言写的

1 n=int(input())
2 sumn=0
3 a=[None]*100
4 a=[1,1]
5 for i in range(2,n+1):
6     a.append(a[i-1]+a[i-2])
7 print(a[n])

第二种解法:用C++语言,只能过部分样例,因为结果数字非常大,需要高精运算,文章末尾有封装好的方法,套进去即可。

 1 #include<iostream>
 2 using namespace std;
 3 int f(int n) {
 4     if (n == 1) return 1;
 5     if (n == 2) return 2;
 6     return f(n - 1) + f(n - 2);
 7 }
 8 int main(){
 9     unsigned long long n;
10     cin >> n;
11     cout << f(n);
12     return 0;
13 }

 

下列代码为套入封装好的高精运算函数,需要注意的是,洛谷官网的课件里的封装代码和课本里的封装代码均有问题,无法直接运行,需要仔细检查修改以后才能使用。

 1 #include<iostream>
 2 #include<string.h>
 3 using namespace std;
 4 struct Bigint {
 5     int len, a[100];
 6     Bigint(int x = 0) { // 初始化数值为x
 7         memset(a, 0, sizeof(a));
 8         for (len = 1; x; len++)
 9             a[len] = x % 10, x /= 10;
10         len--;
11     }
12     // 重载[],可以直接用x[i]代表x.a[i],编写时更加自然
13     int& operator[](int i) { return a[i]; }
14     void flatten(int L) { // 处理进位
15         len = L;
16         for (int i = 1; i <= len; i++)
17             a[i + 1] += a[i] / 10, a[i] %= 10;
18         for (; !a[len];)
19             len--;
20     }
21     void print() {
22         for (int i = max(len, 1); i >= 1; i--)
23             printf("%d", a[i]); // 若数值为0,也需要输出0
24     }
25 };
26 // 表示两个 Bigint 类相加,返回一个 Bigint 类
27 Bigint operator+(Bigint a, Bigint b) {
28     Bigint c;
29     int len = max(a.len, b.len);
30     for (int i = 1; i <= len; i++)
31         c[i] += a[i] + b[i]; // 计算贡献
32         // 答案不超过 len+1 位,所以用 len+1 做一遍“展平”处理进位。
33     c.flatten(len + 1);
34     return c;
35 }
36 Bigint f[5010];
37 int main(){
38     int n;
39     cin >> n;    
40     
41     f[1] = Bigint(1);
42     f[2] = Bigint(2);
43     for (int i = 3; i <= n; i++)
44         f[i] = f[i - 2] + f[i - 1];
45     f[n].print();
46     return 0;
47 }

 

posted @ 2022-01-26 09:01  葛杨杨  阅读(230)  评论(0编辑  收藏  举报