现在的位置: 首页 > 综合 > 正文

hdu 1316 How Many Fibs? (大数问题)

2013年03月24日 ⁄ 综合 ⁄ 共 1402字 ⁄ 字号 评论关闭

嘿嘿,先将每一个Fib打表,之后,就是很暴力的在区间内找咯。

#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#define maxn 600
using namespace std;
int sum[maxn+1][50],len1[maxn+1];
int a[50],b[50],la,lb;
char str1[110],str2[110];
void init()
{
	sum[0][0]=0;len1[0]=0;
	sum[1][0]=1;len1[1]=0;
	sum[2][0]=2;len1[2]=0;
	for(int i=3;i<=maxn;i++)
	{
		int k=0,j;
		for(j=0;j<=len1[i-2];j++)
		{
			int t=k+sum[i-1][j]+sum[i-2][j];
			k=t/10000;
			sum[i][j]=t%10000;
		}
		while((j-1)!=len1[i-1])
		{
			int t=k+sum[i-1][j];
			k=t/10000;
			sum[i][j]=t%10000;
			j++;
		}
		while(k)
		{
			int t=k;
			k=t/10000;
			sum[i][j]=t%10000;
			j++;
		}
		len1[i]=j-1;
	}
}
int compare(int *s,int l,int num)
{
	if(l>len1[num])
		return 1;
	else if(l<len1[num])
		return -1;
	for(int i=l;i>=0;i--)
	{	
		//cout<<s[i]<<' '<<sum[num][i]<<endl;
		if(s[i]>sum[num][i])
		
			return 1;
		else if(s[i]<sum[num][i])
			return -1;
	}
	return 0;
}
void solve()
{
	int t1=1;
	while(la<len1[t1])t1++;//找出第一个长度大于等于左区间Fib
	int i;
	for(i=t1;i<=maxn;i++)//找出第一个大于左区间的Fib
	{	
		if(compare(a,la,i)<=0)
			break;
	}
	int j;
	for(j=i;j<=maxn;j++)//找出第一个大于右区间的Fib
	{
		if(compare(b,lb,j)<0)
			break;
	}
	printf("%d\n",j-i);
}
int main()
{
	int n,len;
	init();
	while(scanf("%s %s",str1,str2)==2)
	{
		if(strcmp(str1,"0")==0 && strcmp(str2,"0")==0)
			break;
		int s1=strlen(str1),s2=strlen(str2);
		la=lb=0;
		for(int i=s1-1;i>=0;i-=4)//将字符串转换为大数的存储方式,四位四位保存进整型数组
		{
			int s=0;
			for(int j=0;j<4&&(i-j)>=0;j++)
				s+=(int)pow(10.0,j)*(str1[i-j]-'0');
			a[la++]=s;
		}
		for(int i=s2-1;i>=0;i-=4)
		{
			int s=0;
			for(int j=0;j<4&&(i-j)>=0;j++)
				s+=(int)pow(10.0,j)*(str2[i-j]-'0');
			b[lb++]=s;
		}
		la--;lb--;
		solve();
	}
	return 0;
}

 

抱歉!评论已关闭.