C++计算第100、200位斐波那契数使用long double结果错误求助
问题原因
- 浮点数类型(
double/long double)的存储有精度上限:double仅能精确表示不超过2^53的整数,对应十进制约15~17位;long double根据平台不同最多也只有几十位的精确整数范围,而斐波那契数列第100位就已经有21位十进制数,远超过浮点数的精确表示范围,自然会出现结果错误。 - 你当前用浮点数存储斐波那契值的方案,天然不适合计算序数较大的斐波那契数。
解决方案
改用大数加法实现,用字符串存储每一位斐波那契数值,手动模拟十进制加法逻辑,就可以支持任意大序数的斐波那契数计算,示例代码如下:
#include <iostream> #include <algorithm> #include <string> using namespace std; // 大数加法:输入两个正整数字符串,返回相加后的字符串 string add(string a, string b) { reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); string res; int carry = 0; int i = 0; while (i < a.size() || i < b.size() || carry) { int sum = carry; if (i < a.size()) sum += a[i] - '0'; if (i < b.size()) sum += b[i] - '0'; carry = sum / 10; res.push_back(sum % 10 + '0'); i++; } reverse(res.begin(), res.end()); return res; } int main() { int n; while (cin >> n) { if (n == 0) { cout << "0\n"; continue; } if (n == 1) { cout << "1\n"; continue; } string a = "0", b = "1", c; for (int i = 2; i <= n; i++) { c = add(a, b); a = b; b = c; } cout << b << "\n"; } return 0; }
该方案没有数值上限限制,只要内存足够可以计算任意序数的斐波那契数,所有运算都是整数精确计算,不会出现精度丢失问题。
内容的提问来源于stack exchange,提问作者Khaldoun Al Halabi
相关产品推荐
相关产品推荐

