首先,我们需要生成一个Fibonacci数列,直到其值超过10^100。由于Fibonacci数列的性质,我们知道这个数列的长度不会超过500。
然后,对于每一对输入的a和b,我们在生成的Fibonacci数列中查找在a和b之间的数的个数。这可以通过二分查找来实现,因为Fibonacci数列是有序的。
以下是对应的C++代码:
- #include
- #include
- #include
- using namespace std;
-
- vector
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数的个数。