您的位置:首页 > 其它

hdu 1316 how many fibs

2011-04-26 02:11 489 查看
这道题,没看清题而wrong answer了好多次,原来是上道大数题不同,f[2]=2;悲剧。。

只要在上道题的基础上加个比较函数就可以了。。

View Code

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char f[2001][2001]={"1","1","2"};
char sh[2001];
char ch1[2001],ch2[2001];
void sum(char a[ ],char b[ ])
{
// printf("%s to %s",a,b);
int len1,len2,i,j,k=0,c[2000];
memset(c,0,sizeof(c));
//memset(sh,' ' ,sizeof(sh));
len1=strlen(a),len2=strlen(b);
//printf("%d %d",len1,len2);
for(i=len1-1;i>=0;i--)
c[len1-i-1]=a[i]-48;
// printf("\n%d",c[0]);

for(j=len2-1;j>=0;j--)
c[len2-j-1]+=b[j]-48;
//  printf("\n%d",c[0]);
len1=len1>len2?len1:len2;
for(i=0;i<=len1;i++)
if(c[i]>9)
{
c[i+1]+=c[i]/10;
c[i]-=10;
}
j=len1+2;
while(!c[j])
j--;
// printf("***%d ",j);

//for(i=0;i<=j;i++)
//  printf("Abc:%d ",c[i]);
for(i=j;i>=0;i--)
sh[k++]=c[i]+48;
sh[k]='\0';
// printf("%s\n",sh);
}
int find(char a[ ],char b[ ])
{
int len1,len2;
len1=strlen(a);
len2=strlen(b);
if(len2>len1)
return -1;
else if(len1>len2)
return 1;
else
return strcmp(a,b);
}

int main( )
{
int i,j,k,N,t,flag,flag2;
for(i=3;i<=2000;i++)
{
sum(f[i-1],f[i-2]);
strcpy(f[i],sh);
}
//scanf("%d",&N);
while(scanf("%s%s",ch1,ch2)!=EOF&&(ch1[0]!='0'||ch2[0]!='0'))
{
k=0,flag=1,flag2=1;
t=0;j=0;
for(i=1;i<=2000;i++)
{
if(find(f[i],ch1)>=0&&flag)
{
t=i;flag=0;
}
if(find(f[i],ch2)>=0&&flag2)
{ j=i;flag2=0;break;}
}
if(strcmp(f[j],ch2)==0)
j=j+1;

printf("%d\n",j-t);
}
return 0;
}


数组开大了点。。其实开到500就可以了....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: