计算第100个斐波那契数,解决数据溢出,用C++实现
时间: 2024-09-14 18:06:42 浏览: 62
经典c++程序100例(21--30).pdf
计算第100个斐波那契数,如果不考虑数据溢出的问题,直接使用递归或简单的循环会很容易导致整型溢出。斐波那契数列的递推公式是:F(n) = F(n-1) + F(n-2),其中F(0) = 0, F(1) = 1。为了解决溢出问题,我们可以使用长整型(long long int)或者更高精度的整数类型。但是由于第100个斐波那契数非常大,即使是64位的long long int类型也无法存储其值,因此我们需要使用更高精度的数据结构,比如C++中的`__int128`(仅限某些编译器支持),或者可以使用数组来存储每一位。
下面是一个使用数组来计算第100个斐波那契数的C++示例代码:
```cpp
#include <iostream>
#include <vector>
using namespace std;
// 使用vector来存储大数,每个元素存储一位
typedef vector<int> BigInteger;
// 函数:将大数字符串转为BigInteger
BigInteger stringToBigInteger(const string &str) {
BigInteger num;
for (int i = str.length() - 1; i >= 0; --i) {
num.push_back(str[i] - '0');
}
return num;
}
// 函数:大数加法
BigInteger add(const BigInteger &num1, const BigInteger &num2) {
BigInteger result(max(num1.size(), num2.size()) + 1, 0);
int carry = 0;
for (size_t i = 0; i < num1.size() || i < num2.size(); ++i) {
int sum = carry;
if (i < num1.size()) sum += num1[i];
if (i < num2.size()) sum += num2[i];
result[i] = sum % 10;
carry = sum / 10;
}
if (carry > 0) {
result.push_back(carry);
}
return result;
}
// 函数:计算第n个斐波那契数
BigInteger fibonacci(int n) {
if (n <= 1) {
return stringToBigInteger(n == 0 ? "0" : "1");
}
BigInteger fib = {0, 1}; // 初始化前两个数
BigInteger fib_n_minus_2, fib_n_minus_1 = fib; // 前两个数的值
BigInteger temp;
for (int i = 2; i < n; ++i) {
fib_n_minus_2 = fib_n_minus_1;
fib_n_minus_1 = fib;
temp = add(fib_n_minus_1, fib_n_minus_2);
fib_n_minus_2 = fib_n_minus_1;
fib_n_minus_1 = temp;
}
return fib_n_minus_1;
}
int main() {
BigInteger result = fibonacci(100);
for (auto it = result.rbegin(); it != result.rend(); ++it) {
cout << *it;
}
cout << endl;
return 0;
}
```
这段代码使用了`vector`来存储每一位数字,通过模拟手工加法的方式来计算大数的加法,并通过迭代的方式来计算斐波那契数列的第100项。
阅读全文