TOJ-1345 How Many Fibs?
Recall the definition of the Fibonacci numbers:
f1 := 1Given two numbers a and b, calculate how many Fibonacci numbers are in the range [a,b].
f2 := 2
fn := fn-1 + fn-2 (n≥3)
Input Specification
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≤10100. The numbers a and b are given with no superfluous leading zeros.
Output Specification
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
5 4
Source: University
of Ulm Local Contest 2000
100位的十进制数只好用字符串了。打表。
#include <iostream> #include <string> using namespace std; int cmp(string a,string b){ int la=a.length(),lb=b.length(); if(a==b) return 0; if(la<lb) return -1; if(la>lb) return 1; if(la==lb){ for(int i=0;i<la;i++){ if(a[i]>b[i]) return 1; if(a[i]<b[i]) return -1; } return 0; } } string add(string a,string b){ string t=""; int la=a.length(),lb=b.length(); if(la<lb){ for(int i=0;i<lb-la;i++) a = "0"+a; } else{ for(int i=0;i<la-lb;i++) b = "0"+b; } int l = a.length(); int c = 0; int n; for(int i=l-1;i>=0;i--){ n = a[i]-'0'+b[i]-'0'+c; c = n/10; t = char(n%10+'0')+t; } if(c) t = char(c+'0')+t; return t; } string fibs[500]; int main(){ string a,b; int i,j,k,count; fibs[0]="0";fibs[1]="1";fibs[2]="2"; for(i=3;i<500;i++){ fibs[i]=add(fibs[i-1],fibs[i-2]); } while(cin>>a>>b,!(a=="0"&&b=="0")){ count = 0; for(i=1;i<500 && cmp(b,fibs[i])>=0;i++){ if(cmp(fibs[i],a)>=0 && cmp(b,fibs[i])>=0) count++; } cout<<count<<endl; } return 0; }