题目:来源于洛谷
楼梯有 N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
输入输出样例
输入 #1
4
输出 #1
5
分析:
用递归的思想超时了,如下
#include <iostream>
#include <cstdio>
using namespace std;
//数楼梯,不一定哦
long long Func(int n) {
/*if (n==1||n==0) {
return 1;
}*/
//另一种写法
if (n == 1) {
return 1;
}
else if(n==2) {
return 2;
}
else {
return Func(n - 1) + Func(n - 2);
}
}
int main() {
int n;
scanf("%d", &n);
printf("%lld", Func(n));
return 0;
}
更简单的思路是递推,如下:
代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
long long p = 0, q = 0, r = 1;
for (int i = 0; i < n; ++i) {
p = q;
q = r;
r = p + q;
}
printf("%lld", r);
return 0;
}
这样虽然不会超时,但是还是会溢出,那怎么办呢?
我想到要用大整数的运算,也就是把每个数位上的数存到数组中
来看一下⑧:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct bign {
int d[2000];
int len;
bign() {
memset(d, 0, sizeof(d));
len = 0;
}
};
//加法
bign add(bign a, bign b) {
bign c;
int carry = 0; //进位
for (int i = 0; i < a.len || i < b.len; i++) {
int temp = a.d[i] + b.d[i] + carry;
c.d[c.len++] = temp % 10;
carry = temp / 10;
}
if (carry) {
c.d[c.len++] = carry;
}
return c;
}
//打印
void print(bign a) {
for (int i = a.len-1; i >= 0; i--) {
printf("%d", a.d[i]);
}
}
int main() {
bign p;
bign q;
bign r;
p.d[p.len++] = 0;
q.d[q.len++] = 0;
r.d[r.len++] = 1;
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
p = q;
q = r;
r = add(p,q);
}
print(r);
return 0;
}
(●ˇ∀ˇ●)