首先,我们需要生成一个Fibonacci数列,直到其值超过10^100。由于Fibonacci数列的性质,我们知道这个数列的长度不会超过500。
然后,对于每一对输入的a和b,我们在生成的Fibonacci数列中查找在a和b之间的数的个数。这可以通过二分查找来实现,因为Fibonacci数列是有序的。
以下是对应的C++代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<string> fibs;
// 大数加法
string add(string num1, string num2) {
string res;
int i = num1.size() - 1;
int j = num2.size() - 1;
int carry = 0;
while(i >= 0 || j >= 0 || carry != 0) {
int sum = carry;
if(i >= 0) sum += num1[i--] - '0';
if(j >= 0) sum += num2[j--] - '0';
res += to_string(sum % 10);
carry = sum / 10;
}
reverse(res.begin(), res.end());
return res;
}
// 大数比较
bool compare(string num1, string num2) {
if(num1.size() != num2.size()) return num1.size() < num2.size();
return num1 < num2;
}
// 生成Fibonacci数列
void generateFibonacci() {
fibs.push_back("1");
fibs.push_back("2");
while(true) {
string fib = add(fibs[fibs.size() - 1], fibs[fibs.size() - 2]);
if(compare(fib, string(101, '0'))) fibs.push_back(fib);
else break;
}
}
int main() {
generateFibonacci();
string a, b;
while(cin >> a >> b) {
if(a == "0" && b == "0") break;
int count = upper_bound(fibs.begin(), fibs.end(), b, compare) - lower_bound(fibs.begin(), fibs.end(), a, compare);
cout << count << endl;
}
return 0;
}
这段代码首先生成了一个Fibonacci数列,然后对于每一对输入的a和b,它计算并输出在a和b之间的Fibonacci数的个数。