uva 10183 How many Fibs?

来源:互联网 发布:手机如何举报淘宝卖家 编辑:程序博客网 时间:2024/06/06 01:07


Problem B: 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 1001234567890 98765432100 0

Sample Output

54
题意:每个数都是由前两的和所求;输入两个数a,b询问这两个之间包含a,b之间有多少个数,由于数字较大必须字符串处理,要用到大数加法,在查找时要用到字符串的比较
#include<iostream>#include<stdio.h>#include<string>#include<algorithm>using namespace std;string ss[2000];string add(string a,string b)//  大数加法 {    string s;    int i=0,j=0,l=0;    int m,ans=0,k;    while(a[i]&&b[j])    {        m=a[i]-'0'+b[j]+ans-'0';        ans = m / 10;        s+=(m%10+'0');        i++;        j++;    }    if(i==a.size())    {        while(i != b.size())        {            m = ans + b[i] - '0';            ans = m / 10;            s += m % 10 + '0';            i++;        }        if(ans) s += ans + '0';    }    else if(i==b.size())    {        while(i != a.size())        {            m = ans + a[i] - '0';            ans = m / 10;            s += m % 10 + '0';            i++;        }        if(ans) s += ans + '0';    }    reverse(s.begin(), s.end());    return s;}int compare(string a,string b)// 字符串比较函数{    if(a.size()!=b.size())    {        if(a.size()>b.size())            return 1;        if(a.size()<b.size())            return -1;    }    else if(a.size()==b.size())    {        for(int i=0; i<a.size(); i++)        {            if(a[i]>b[i])                return 1;            else if(a[i]<b[i])                return -1;        }        return 0;    }}int main(){    int i;    ss[1]="1";    ss[2]="2";    for(i=3; i<1500; i++)    {        reverse(ss[i-1].begin(),ss[i-1].end());        reverse (ss[i-2].begin(),ss[i-2].end());        ss[i]=add(ss[i-1],ss[i-2]);        reverse(ss[i-1].begin(),ss[i-1].end());        reverse(ss[i-2].begin(),ss[i-2].end());    }//    for(i=30;i<=40;i++)//       cout<<ss[i]<<endl;    string a,b;    while(cin>>a>>b&&a[0]!='0'||b[0]!='0')//在不等于零时要用或不能用且要不输入0 1 是无结果    {        int ans=0;        for(i=1; i<1500; i++)        {            if((compare(ss[i],a)>=0&&compare(ss[i],b)<=0))            {                ans++;            }           else if(compare(ss[i],b)>0)                break;        }        cout<<ans<<endl;    }    return 0;}
                                             
0 0