hdu 1316 how many fibs

这道题,没看清题而wrong answer了好多次,原来是上道大数题不同,f[2]=2;悲剧。。

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

View Code
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 char f[2001][2001]={"1","1","2"};
5 char sh[2001];
6 char ch1[2001],ch2[2001];
7 void sum(char a[ ],char b[ ])
8 {
9 // printf("%s to %s",a,b);
10 int len1,len2,i,j,k=0,c[2000];
11 memset(c,0,sizeof(c));
12 //memset(sh,' ' ,sizeof(sh));
13 len1=strlen(a),len2=strlen(b);
14 //printf("%d %d",len1,len2);
15 for(i=len1-1;i>=0;i--)
16 c[len1-i-1]=a[i]-48;
17 // printf("\n%d",c[0]);
18
19 for(j=len2-1;j>=0;j--)
20 c[len2-j-1]+=b[j]-48;
21 // printf("\n%d",c[0]);
22 len1=len1>len2?len1:len2;
23 for(i=0;i<=len1;i++)
24 if(c[i]>9)
25 {
26 c[i+1]+=c[i]/10;
27 c[i]-=10;
28 }
29 j=len1+2;
30 while(!c[j])
31 j--;
32 // printf("***%d ",j);
33
34 //for(i=0;i<=j;i++)
35 // printf("Abc:%d ",c[i]);
36 for(i=j;i>=0;i--)
37 sh[k++]=c[i]+48;
38 sh[k]='\0';
39 // printf("%s\n",sh);
40 }
41 int find(char a[ ],char b[ ])
42 {
43 int len1,len2;
44 len1=strlen(a);
45 len2=strlen(b);
46 if(len2>len1)
47 return -1;
48 else if(len1>len2)
49 return 1;
50 else
51 return strcmp(a,b);
52 }
53
54 int main( )
55 {
56 int i,j,k,N,t,flag,flag2;
57 for(i=3;i<=2000;i++)
58 {
59 sum(f[i-1],f[i-2]);
60 strcpy(f[i],sh);
61 }
62 //scanf("%d",&N);
63 while(scanf("%s%s",ch1,ch2)!=EOF&&(ch1[0]!='0'||ch2[0]!='0'))
64 {
65 k=0,flag=1,flag2=1;
66 t=0;j=0;
67 for(i=1;i<=2000;i++)
68 {
69 if(find(f[i],ch1)>=0&&flag)
70 {
71 t=i;flag=0;
72 }
73 if(find(f[i],ch2)>=0&&flag2)
74 { j=i;flag2=0;break;}
75 }
76 if(strcmp(f[j],ch2)==0)
77 j=j+1;
78
79 printf("%d\n",j-t);
80 }
81 return 0;
82 }
83
84
数组开大了点。。其实开到500就可以了....

posted on 2011-04-26 02:11  more think, more gains  阅读(232)  评论(0编辑  收藏  举报

导航