POJ 2413 How many Fibs?(高精度)
复习的好累啊,刷个题。。。题意简单给两个数,找中间有多少个斐波那契数,最大可能有100位。
先预处理出来,大数比较,我用的方法比较搞,以前做UVA的时候想出的一种方法,先判断位数,然后位数相同时,用strcmp函数来判断,因为此函数,可以判断两个字符串的字典序大小,然后注意点找的时候小细节就OK了。。。难得的1Y,话说UVA那个高精度 我还没过啊,UVA上各种坑人啊,如果数据有前导0,此算法悲剧。。。
1 #include <stdio.h> 2 #include <string.h> 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 else 53 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 else 66 break; 67 } 68 } 69 printf("%d\n",j-i); 70 } 71 return 0; 72 }