P1255 数楼梯

一、整体思路

1、对于上到第n级台阶,我们可以在第n-2级台阶处一步上两个台阶,也可以在第n-1级台阶处一步上一个台阶

2、因此可以推出递推公式(其实就是斐波那契数列)

fun(n)函数为上第n级台阶的走法
fun(n) = fun(n - 1) + fun(n - 2)

3、因此按照正常做法只需要使用递推求出结果即可

4、对于本题来说,直接递推可能会超时,因此使用循环的方法来替换递推

if(n == 1)
		cout<<"1"<<endl;
	else if(n == 2)
		cout<<"2"<<endl;
	else {
		int a = 1, b = 2, c;
		for(int i = 3; i <= n; i++) {
			// c就是到i级台阶的走法,b就是i-1级,a就是i-2级
			c = a + b;
			a = b;
			b = c;
		}
		cout<<c<<endl;
	}

5、然而结果并不如人意,因为n给出的最大值可以到5000,此时的结果已经远远超出long long int 范围,因此我们需要嵌入大整数相加的算法(使用数组来进行加法)

二、整体代码

#include<iostream>
#include<string>
#include <algorithm>

using namespace std;

int main() {
	int n, i, j, k;
	cin>>n;
	if(n == 1)
		cout<<"1"<<endl;
	else if(n == 2)
		cout<<"2"<<endl;
	else {
		string a = "1", b = "2", c;
		for(i = 3; i <= n; i++) {
			// 大整数加法
			c = "";
			int len1 = a.length(), len2 = b.length(), temp = 0;
			for(j = 0; j < len1; j++) {
				temp = int(a[j] - '0' + b[j] - '0') + temp;
				c += char(temp % 10 + '0');
				temp /= 10;
			}
			for(j; j < len2; j++) {
				temp = int(b[j] - '0') + temp;
				c += char(temp % 10 + '0');
				temp /= 10;
			}
			if(temp)
				c += char(temp + '0');
			a = b, b = c;
		}
		// 将字符串逆置
		reverse(c.begin(), c.end());
		cout<<c<<endl;
	}
	return 0;
}

三、补充内容

P2437 蜜蜂路线和本题几乎一样,只需要将输入内容替换一下就行,其他均不变

// 只展示修改内容(输入)
cin>>n>>m;
n = m - n;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

horizonTel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值