复习的好累啊,刷个题。。。题意简单给两个数,找中间有多少个斐波那契数,最大可能有100位。
先预处理出来,大数比较,我用的方法比较搞,以前做UVA的时候想出的一种方法,先判断位数,然后位数相同时,用strcmp函数来判断,因为此函数,可以判断两个字符串的字典序大小,然后注意点找的时候小细节就OK了。。。难得的1Y,话说UVA那个高精度 我还没过啊,UVA上各种坑人啊,如果数据有前导0,此算法悲剧。。。
1 #include2 #include 3 int p[601][201],num[601]; 4 char str[601][201]; 5 int main() 6 { 7 int i,j,len1,len2; 8 char a[101],b[101]; 9 p[1][0] = 1;p[2][0] = 2;10 num[1] = num[2] = 0;11 for(i = 3;i <= 500;i ++)12 {13 num[i] = num[i-1];14 for(j = 0;j <= num[i];j ++)15 {16 p[i][j] = p[i-1][j] + p[i-2][j];17 }18 for(j = 0;j <= num[i];j ++)19 {20 if(p[i][j] > 9)21 {22 p[i][j+1] += p[i][j]/10;23 p[i][j] = p[i][j]%10;24 if(j+1>num[i])25 num[i] = j + 1;26 }27 }28 }29 for(i = 1;i <= 500;i ++)30 {31 for(j = 0;j <= num[i];j ++)32 {33 str[i][num[i]-j] = p[i][j] + '0';34 }35 str[i][num[i]+1] = '\0';36 }37 while(scanf("%s%s",a,b)!=EOF)38 {39 if(a[0] == '0'&&b[0] == '0')40 break;41 len1 = strlen(a) - 1;42 len2 = strlen(b) - 1;43 for(i = 1;;i ++)44 {45 if(num[i] >= len1)46 {47 if(num[i] == len1)48 {49 if(strcmp(str[i],a)>=0)50 break;51 }52 else53 break;54 }55 }56 for(j = i;;j ++)57 {58 if(num[j] >= len2)59 {60 if(num[j] == len2)61 {62 if(strcmp(str[j],b)>0)63 break;64 }65 else66 break;67 }68 }69 printf("%d\n",j-i);70 }71 return 0;72 }