• C++
  • C++ 高精度斐波那契数列

  • @ 2025-5-16 11:56:28

C++ 高精度斐波那契数列教程(0基础通俗易懂)

📚 什么是高精度斐波那契数列?

斐波那契数列是这样一个数列:

F(0) = 0
F(1) = 1
F(n) = F(n-1) + F(n-2)   (n ≥ 2)

它的前几项是:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

问题来了:
当 n 很大时(比如 n = 1000),斐波那契数的值会远远超过 long long 的范围,这时候就不能用普通整型来保存了。

所以我们就要用高精度算法,手动模拟加法运算,从而计算出非常大的斐波那契数。


🧠 基本思路

我们使用 字符串或 vector 来表示大数,然后实现一个高精度加法函数,用于计算斐波那契数列中的每一项。

关键点:

  • 使用 vector<int> 存储每一位数字(便于进位操作)
  • 实现高精度加法函数 add(const vector<int>& a, const vector<int>& b)
  • 使用循环依次计算每一项:f[n] = f[n-1] + f[n-2]

💡 数据结构选择:vector

我们将每个数字按个十百千万顺序存储在一个 vector<int> 中。例如:

数字 123 表示为 {3, 2, 1}

这样从前往后就可以一位一位相加,方便处理进位。


💻 示例代码(完整可运行)

#include <iostream>
#include <vector>
using namespace std;

// 打印结果:把 vector<int> 反转输出
void print(const vector<int>& v) {
    for (int i = v.size() - 1; i >= 0; i--)
        cout << v[i];
    cout << endl;
}

// 高精度加法:a + b
vector<int> add(const vector<int>& a, const vector<int>& b) {
    vector<int> res;
    int carry = 0;

    // 同时遍历两个数组
    int i = 0;
    while (i < a.size() || i < b.size()) {
        int sum = carry;
        if (i < a.size()) sum += a[i];
        if (i < b.size()) sum += b[i];
        res.push_back(sum % 10);
        carry = sum / 10;
        i++;
    }

    // 处理最后的进位
    if (carry > 0)
        res.push_back(carry);

    return res;
}

// 计算第 n 项斐波那契数
vector<int> fib(int n) {
    if (n == 0) return {0};
    if (n == 1) return {1};

    vector<int> a = {0}; // F(0)
    vector<int> b = {1}; // F(1)

    for (int i = 2; i <= n; ++i) {
        vector<int> c = add(a, b); // c = a + b
        a = b;                     // 更新 a
        b = c;                     // 更新 b
    }

    return b;
}

int main() {
    int n;
    cout << "请输入要计算的斐波那契数的序号 n:";
    cin >> n;

    if (n < 0) {
        cout << "负数没有斐波那契数!" << endl;
        return 0;
    }

    vector<int> result = fib(n);

    cout << "F(" << n << ") = ";
    print(result);

    return 0;
}

📖 示例运行

输入:

请输入要计算的斐波那契数的序号 n:50

输出:

F(50) = 12586269025

再试一个更大的:

输入:

请输入要计算的斐波那契数的序号 n:100

输出:

F(100) = 354224848179261915075

✅ 总结知识点

内容 说明
使用 vector 存储每一位数字,便于进位操作
高精度加法 自定义实现两个大数相加
斐波那契逻辑 从 F(0) 和 F(1) 开始,循环累加到 F(n)
输出方式 逆序打印 vector 中的每一位

🧪 练习建议

你可以试着扩展以下功能:

  • 把结果写入文件保存(如 fibonacci.txt
  • 统计执行时间,看看不同 n 对性能的影响
  • 实现一个函数,把 vector<int> 转成字符串返回
  • 支持输出多个斐波那契数(比如前 100 项)

📌 进阶学习建议

如果你已经掌握高精度斐波那契数列,可以挑战以下内容:

  • 实现高精度矩阵快速幂加速斐波那契数列计算(O(log n) 算法)
  • 实现高精度卢卡斯数列(Lucas Sequence)
  • 尝试使用类封装你的高精度库(面向对象编程)
  • 探索模意义下的斐波那契数列(Fibonacci Modulo)

📚 附录:常见斐波那契数长度参考

n F(n) 的位数
10 3 位
50 11 位
100 21 位
500 104 位
1000 209 位
10000 2089 位

如果你希望我继续扩展以下内容,请告诉我:

  • 如何优化性能?
  • 如何支持浮点数版本的斐波那契数列?
  • 如何把结果保存为文件?
  • 如何用矩阵快速幂加速?

😊

0 条评论

目前还没有评论...