【qduoj - 夏季学期创新题】C语言课程设计-阶梯问题(dp,高精度大数)

版权声明:欢迎学习我的博客,希望ACM的发展越来越好~ https://blog.csdn.net/qq_41289920/article/details/83684372

题干:

描述

N级阶梯,人可以一步走一级,也可以一步走两级,求人从阶梯底端走到顶端可以有多少种不同的走法。

输入

一个整数n,代表台阶的阶数。

输出

求人从阶梯底端走到顶端可以有多少种不同的走法,输出结果的格式为大整数.

输入样例 1 

1

输出样例 1

1

输入样例 2 

2

输出样例 2

2

输入样例 3 

4

输出样例 3

5

解题报告:

   数据小的时候就不解释了吧、、但是这题原则上是要用高精度的、、但是因为是面向全体学生的。。所以数据就改回了longlong类型、、顺便附上暑假写的那个大数加法、(深深的记得当时调试了半天还以为是大数加法写错了结果发现是多组输入、、2333)

AC代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
char f[5005][10005];
int wei[50005];
int f1[1000005];
int f2[1000005];
ll n;
void add(ll x,ll y) {
	int p = max(wei[y],wei[x]);
	for(int i = 0; i<p; i++) {
		f[x][i] = ( f[x][i] + f[y][i] ) ;
		f[x][i+1] += f[x][i] / 10;
		f[x][i] %= 10;
	}
	while(f[x][p] != 0) {
		f[x][p+1]+=f[x][p]/10;
		f[x][p]%=10;
		p++;
	}
	wei[x]=p;
}
//void add(int *f,int *g) {
//	int p = max(wei[y],wei[x-2]);
//	for(int i = 0; i<p; i++) {
//		f[x][i] = ( f[x][i] + f[y][i] ) ;
//		f[x][i+1] += f[x][i] / 10;
//		f[x][i] %= 10;
//	}
//	while(f[x][p] != 0) {
//		f[x][p+1]+=f[x][p]/10;
//		f[x][p]%=10;
//		p++;
//	}
//	wei[x]=p;
//}
int main()
{	
	ll n;
	while(~scanf("%lld",&n)) {
		memset(f,0,sizeof f);
		f[1][0] = 1;
		f[2][0] = 2;
		wei[1]=wei[2]=1;
		for(ll i = 3; i<=n; i++) {
			add(i,i-1);add(i,i-2);
		}
		for(int i = wei[n]-1; i>=0; i--) {
			printf("%1d",f[n][i]);
		}
		printf("\n");
	}
	
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/qq_41289920/article/details/83684372