TOJ-1345 How Many Fibs?

Recall the definition of the Fibonacci numbers:
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 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;
}

 

posted @ 2017-02-09 15:59  DGSX  阅读(140)  评论(0编辑  收藏  举报