top1编程
← 返回题目
题解

计算分数表达式_斐波那契数列

1 条题解

  • 0
    @ 2026-8-5 1:08:04

    解题思路

    这道题的表达式(看图)是:

    f(n) = 1/F1 + 1/F2 + 1/F3 + ... + 1/Fn

    其中 F 是斐波那契数列:1、1、2、3、5、8、13…… 它的规律特别简单:从第3项开始,每一项 = 前两项之和(比如 2=1+1,3=1+2,5=2+3)。

    先看样例 n=5: f(5) = 1/1 + 1/1 + 1/2 + 1/3 + 1/5 = 1 + 1 + 0.5 + 0.333... + 0.2 = 3.0333...

    保留三位小数就是 3.033,和样例完全一致!

    怎么写程序?

    我们需要边生成斐波那契数列边累加。用两个变量 a、b 滚动前进:

    • 一开始 a=1(第1项),b=1(第2项);
    • 每一轮加上 1/a;
    • 然后算下一个斐波那契数:c = a + b,再让 a = b、b = c,整体往后挪一格。

    这样循环 n 次,就能把前 n 项的倒数都加起来,不用开数组,非常省内存!

    保留三位小数:题目要求用格式化输出,我们用 printf("%.3lf\n", sum),其中 .3 就是"保留3位小数"的意思。

    注意:累加分数时要用 1.0 / a,写成 1 / a 就变成整数除法了(结果永远是0),这是最容易犯的小错误!

    参考代码

    // P4479 计算分数表达式(斐波那契数列):f(n)=1/F1+1/F2+...+1/Fn,F为斐波那契数列1,1,2,3,5,...
    // 题目要求格式化输出,保留三位小数,使用printf
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int main() {
        int n;
        cin >> n;
        double sum = 0;      // 累加所有分数的和
        double a = 1, b = 1; // 斐波那契数列前两项 F1=1, F2=1
        for (int i = 1; i <= n; i++) {
            sum += 1.0 / a;    // 加上第i项 1/Fi(用1.0保证是小数除法)
            double c = a + b;  // 下一个斐波那契数 = 前两项之和
            a = b;             // 整体往后挪:原来的b变成新的a
            b = c;             // 新的b是最新算出的数
        }
        printf("%.3lf\n", sum);  // 保留三位小数输出
        return 0;
    }
    

    复杂度分析

    • 时间:循环 n 次生成斐波那契数并累加,是 O(n)。n 再大也不用怕,每次只有一次加减和除法。
    • 空间:只用了 sum、a、b、c 几个变量,是 O(1),几乎不占内存。
    • 1