How many Fibs?
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 11744 | Accepted: 4257 |
Description
Recall the definition of the Fibonacci numbers:
Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a,b].
f1 := 1 f2 := 2 fn := fn-1 + fn-2 (n>=3)
Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a,b].
Input
The input contains several test cases. Each test case consists of two non-negative integer numbers a and b. Input is terminated by a=b=0. Otherwise, a<=b<=10
100. The numbers a and b are given with no superfluous leading zeros.
Output
For each test case output on a single line the number of Fibonacci numbers fi with a<=fi<=b.
Sample Input
10 100 1234567890 9876543210 0 0
Sample Output
54
代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int maxn=550; const int maxnlen=130; int f[maxn][maxnlen]; char fi[maxn][maxnlen]; void fibo() { f[1][0]=1; f[2][0]=2; for(int i=3; i<=500; i++) for(int j=0; j<=110; j++) { f[i][j]+=(f[i-1][j]+f[i-2][j]); if(f[i][j]>=10) { f[i][j+1]=f[i][j]/10; f[i][j]=f[i][j]%10; } } for(int i=1; i<=500; i++) { int j; for( j=110; j>=0; j--) if(f[i][j]==0) continue; else break; int k=0; for(; j>=0; j--) fi[i][k++]=f[i][j]+'0'; fi[i][k]='\0'; } } int cmp(char *a,char *b) { int lena=strlen(a); int lenb=strlen(b); if(lena!=lenb) return lena>lenb?1:-1; else return strcmp(a,b); } int search(char *a,bool &flag) { int low=1; int high=480; while(low<=high) { int mid=(low+high)/2; int res=cmp(a,fi[mid]); if(res==0) { flag=1; return mid; } else if(res<0) high=mid-1; else low=mid+1; } return high; } char a[maxnlen],b[maxnlen]; int main() { fibo(); while(~scanf("%s%s",a,b)) { if(strcmp(a,"0")==0&&strcmp(b,"0")==0) return 0; bool flaga =0; bool flagb=0; int left=search(a,flaga); int right=search(b,flagb); if(flaga) { printf("%d\n",right-left+1); } else printf("%d\n",right-left); } return 0; }