Problem B: How many Fibs?
Recall the definition of the Fibonacci numbers:
f 1 := 1Given two numbers a and b , calculate how many Fibonacci numbers are in the range [ a , b ].
f 2 := 2
f n := f n-1 + f n-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
题意:每个数都是由前两的和所求;输入两个数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;
}