【高精度】数楼梯

【高精度】数楼梯

题目

题目描述

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

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

输入格式

一个数字,楼梯数。

输出格式

走的方式几种。

输入输出样例

输入 #1 复制
4
输出 #1 复制
5
说明/提示
60% N<=50
100% N<=5000)

分析

原本一看,这不是 斐波那契数列 吗,直接公式下去写完,(dp[i] = dp[i-1]+ dp[i-2];)
结果超时好多。。。。。其实这个题标注(高精度)那有这样就搞定的。。。

//int n;
//int dp[5005];
//int main(){
//	cin>>n;
//	dp[0]= 1;
//	dp[1]= 1;
//	for(int i=2;i<=n;i++){
//		dp[i] = dp[i-1]+ dp[i-2];
//	}
//	cout<<dp[n]<<endl;
//	return 0;
//}

由 斐波那契数列 得, c (i)= c(i-1)+c(i-2); 这里我们把c(i-1)当成a,c(i-2)当成b,c(i)当成c。
比如: a是第一阶,a=1(一种走法),b是第二阶,b=2(两种走法)…c是三阶,c = a+b = 3 (三种走法).
然后我们把b赋给a,c赋给b,(这时a是第二阶,b是第三阶)然后再执行一次 c = a+b;(c自然是第四阶)
由此类推,能得到 第n阶 有几种走法。

然后,我们把它换成高精度的写法,就ok了。。。。。。

代码

#include<iostream>
#include<cstring>
using namespace std;

const int maxn = 5005;

int a[maxn],b[maxn],c[maxn];
int n;

int main(){
	a[1] =1;
	b[1] =2;
	cin>>n;
	
	// c =a+b;   b=c; a=b;
	int lc=1;
	for(int i=3;i<=n;i++){
	//注意每次要先清0.
		memset(c,0,sizeof(c));
		for(int j=1;j<=lc;j++){
			c[j] += a[j] +b[j];
			c[j+1] += c[j]/10;
			c[j] %= 10;
		}
		//a= b; 
		if(c[lc+1]>0)lc++;
		for(int j=1;j<=lc;j++){
			a[j] = b[j];
		}
		//b =c;
		for(int j=1;j<=lc;j++){
			b[j] = c[j];
		}
	}
	
	if(n<3){
		cout<<n<<endl;
		return 0;
	} 
	for(int i=lc;i>=1;i--){
		cout<<c[i];
	}
	return 0;	
}

发布了75 篇原创文章 · 获赞 1 · 访问量 3633

猜你喜欢

转载自blog.csdn.net/A793488316/article/details/104832559
今日推荐