洛谷 P1255 数楼梯(高精度+斐波那契数列)

题目链接:点击这里
洛谷 P1255 数楼梯(高精度+斐波那契数列)_第1张图片
循环解法,得到一半分数:

#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 1010;
int a[maxn];

int main()
{
     
	int n;
	scanf("%d",&n);	//输入n 
	if(n<=2)
	{
     
		printf("%d\n",n);
		return 0;
	}
	int a = 1, b = 2, tmp;
	for(int i=3;i<=n;i++)
	{
     
		tmp = a + b;
		a = b;
		b = tmp;
	}
	printf("%d\n",b);
	return 0;
}

N<=5000,数据过大,将上面程序改成高精度+斐波那契数列,AC:

#include
#include
#include
#include
#include
#include
#include
#include

using namespace std;
typedef long long ll;
const int MOD = 10000007;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const int maxn = 10010;
int a[maxn],b[maxn],tmp[maxn];

int main()
{
     
	int n;
	scanf("%d",&n);	//输入n 
	if(n<=2)
	{
     
		printf("%d\n",n);
		return 0;
	}
	a[1] = 1;
	b[1] = 2;
	int digits = 1;		//位数 
	for(int i=3;i<=n;i++)
	{
     
		//tmp = a + b; 
		for(int j=1;j<=digits;j++)
			tmp[j] = a[j] + b[j];	//对应位上数字相加 
		for(int j=1;j<=digits;j++)
		{
     
			if(tmp[j]>9)	//进位 
			{
     
				tmp[j+1] += tmp[j]/10;
				tmp[j] %= 10;
				if(j+1>digits)
					digits++; 
			}
		}
		
		//a = b;
		for(int j=1;j<=digits;j++)
			a[j] = b[j];
		//b = tmp;
		for(int j=1;j<=digits;j++)
			b[j] = tmp[j];
	}
	//printf("%d\n",b);
	for(int i=digits;i>0;i--)
		printf("%d",b[i]);
	return 0;
}

你可能感兴趣的:(高精度,数论)