洛谷P1255 数楼梯

递推基础题。对于洛谷的测试,此方法可以AC。acwing不行。

此问题就是个斐波那契数列f(x)=f(x-1)+f(x-2)。但由于数据过大,只能再用高精配合

思路:

1.定义三个数组,分别代表f(x)、f(x-1)、f(x-2)。

2.一个递推函数

3.一个高精度函数

4.一个复制函数,在x值变化时改变三个数组的对应值

首先是主函数

代码:

int main()
{
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	a[0]=1;
	b[0]=2;
	int n;
	cin>>n;
	if(n==1)
	{
		cout<<1;
		return 0;
	}
	if(n==2)
	{
		cout<<2;
		return 0;
	}//这两种情况直接输出 
	for(int i=3;i<=n;i++)
	{
		louti();
		gaojing();
		fuzhi();
	}
	for(int i=cnt;i>=0;i--)
	{
		if(i==cnt&&c[i]==0)
		{
			continue;
		}
		cout<<c[i];
	}
}

  没什么好说的

  函数2(递推):

void louti()
{
	memset(c,0,sizeof(c));
	for(int i=0;i<cnt;i++)
	{
		c[i]+=a[i];
		c[i]+=b[i];
	}
}

 注意,此函数中必须有

memset(c,0,sizeof(c));

  因为c(答案数组)的值并非一个累计的值,在复制函数后,c所代表的值是一个空域,需要加进去。

函数3(高精):

void gaojing()
{
	int k;
	for(int i=0;i<cnt;i++)
	{
		k=c[i];
		if(i==cnt-1&&c[i]>=10)
		{
			cnt++;
		}
		if(c[i]>=10)
		{
			c[i+1]+=k/10;
			c[i]%=10;
		}
		
	}
}

只需要做针对c的函数,原因下讲。

函数4(复制):

void fuzhi()
{
	for(int i=0;i<cnt;i++)
	{
		a[i]=b[i];
		b[i]=c[i];
	}
}

 当c数组已经排列好后,a、b数组的值的来源便是c数组,所以就不用再针对a、b再次高精度运算。

总代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[1000005],b[1000005],c[1000005]/*答案数组*/;
int cnt=1;//计数 
void fuzhi()
{
	for(int i=0;i<cnt;i++)
	{
		a[i]=b[i];
		b[i]=c[i];
	}
}
void gaojing()
{
	int k;
	for(int i=0;i<cnt;i++)
	{
		k=c[i];
		if(i==cnt-1&&c[i]>=10)
		{
			cnt++;
		}
		if(c[i]>=10)
		{
			c[i+1]+=k/10;
			c[i]%=10;
		}
		
	}
}
void louti()
{
	memset(c,0,sizeof(c));
	for(int i=0;i<cnt;i++)
	{
		c[i]+=a[i];
		c[i]+=b[i];
	}
}
int main()
{
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	a[0]=1;
	b[0]=2;
	int n;
	cin>>n;
	if(n==1)
	{
		cout<<1;
		return 0;
	}
	if(n==2)
	{
		cout<<2;
		return 0;
	}//这两种情况直接输出 
	for(int i=3;i<=n;i++)
	{
		louti();
		gaojing();
		fuzhi();
	}
	for(int i=cnt;i>=0;i--)
	{
		if(i==cnt&&c[i]==0)
		{
			continue;
		}//没什么用的小代码。 
		cout<<c[i];
	}
}

上一篇:洛谷P7735题解


下一篇:SP18966 VACATION - Vacation Planning 题解