hdu 1316 How Many Fibs? (大数问题)
嘿嘿,先将每一个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;
}

浙公网安备 33010602011771号