hoj1047-How Many Fibs?(高精度fib序列)
给出两个数,求出这两个数之间有多少个fib数, 但是题目给出的数是10^100所以要用大数来处理
用大数相加算法,求出fib[1024]之内的所有数,然后再找出两数之前多少个开始统计
#include <iostream>优质内容筛选与推荐>>
#include <string>
using namespace std;
string operator +(const string &a, const string &b)
{
int i;
int sum[2001] = {0};
int len1 = strlen(a.c_str());
int len2 = strlen(b.c_str());
for(i = 0; i<len1; i++)
sum[i] += a.at(len1 - 1 - i) - '0';
for(i = 0; i<len2; i++)
sum[i] += b.at(len2 - 1 - i) - '0';
int max = len1 > len2 ? len1 : len2;
for(i = 0; i < max; i++)
{
if(sum[i] > 9)
{
sum[i + 1] += sum[i] / 10;
sum[i] %= 10;
if(i == max - 1)
max++;
}
}
string tmp("");
for(i = max - 1; i >= 0; i--)
tmp += (sum[i] + '0');
return tmp;
}
static string fib[1024];
int main()
{
string a,b;
fib[0] = "1";
fib[1] = "1";
for(int i = 2; i < 1024; i++)
{
fib[i] = fib[i - 1] + fib[i - 2];
}
fib[0] = "0";
int n;
while(cin >> a >> b &&(a[0]-'0'||b[0]-'0'))
{
int i=1,c=0;
while(1) //找出不小于a的第一个fib数的下标
{
if(fib[i].length() > a.length()) break;
else if(fib[i].length() == a.length() && fib[i]>=a) break;
i++;
}
while(1)
{
if(fib[i]==b) {c++;break;}
if(fib[i].length() > b.length()) break;
else if(fib[i].length() == b.length() && fib[i]>b) break;
i++;
c++;
}
cout << c << endl;
}
return 0;
}