题解:洛谷 P1720 月落乌啼算钱

【题目来源】

洛谷:P1720 月落乌啼算钱(斐波那契数列) - 洛谷

【题目描述】

算完钱后,月落乌啼想着:“你 TMD 坑我,(以下用闽南语读)归粒靠杯靠亩诶,(以下用英读)是伊特游!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第 \(n\) 样菜价格多少?”月落乌啼写出了:

由于爱与愁大神学过编程,于是就用 \(1\) 分钟的时间求出了 \(F_n\) 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出 $F_n $ 的值吗?

【输入】

一行一个自然数 \(n\)

【输出】

只有 \(1\) 行一个实数 \(F_n\),保留两位小数。

【输入样例】

6

【输出样例】

8.00

【核心思想】

  1. 问题分析:求斐波那契数列第 \(n\) 项的值,要求保留两位小数。题目给出的公式为比内公式(Binet's Formula)\(F_n = \frac{1}{\sqrt{5}}\left[\left(\frac{1+\sqrt{5}}{2}\right)^n - \left(\frac{1-\sqrt{5}}{2}\right)^n\right]\)

  2. 算法选择

    • 比内公式直接计算:利用黄金分割比例 \(\phi = \frac{1+\sqrt{5}}{2}\) 及其共轭 \(\hat{\phi} = \frac{1-\sqrt{5}}{2}\),直接代入公式计算第 \(n\)
  3. 关键步骤

    • 读入数据cin >> n
    • 预计算常量
      • t = sqrt(5)
      • a = (1 + t) / 2:黄金分割比例 \(\phi \approx 1.618\)
      • `b = (1 - t) / 2$:共轭比例 \(\hat{\phi} \approx -0.618\)
    • 代入比内公式
      • f = (pow(a, n) - pow(b, n)) / t
    • 格式化输出printf("%.2f", f) 保留两位小数
  4. 时间/空间复杂度

    • 时间复杂度:\(O(1)\),固定次数的数学运算
    • 空间复杂度:\(O(1)\),仅需常数个变量
  5. 闭式解的核心思想

    • 比内公式:斐波那契数列的通项公式,将递推问题转化为直接的幂运算
    • 黄金分割比例\(\phi^n\) 主导增长,\(\hat{\phi}^n\)\(|\hat{\phi}| < 1\) 而迅速衰减,两者之差除以 \(\sqrt{5}\) 恰好得到整数
    • 浮点精度:由于浮点数精度限制,当 \(n\) 较大时结果可能有微小误差,但题目范围内可接受
    • 适用于递推数列闭式解、黄金分割、数学公式实现类入门问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
#include <math.h>        // 包含数学函数库(使用sqrt和pow函数)
using namespace std;     // 使用标准命名空间

/**
 * 主函数 - 程序入口
 * @return 程序执行状态码(0表示成功)
 */
int main()
{
    int n;               // 定义变量:斐波那契数列的项数n
    double t = sqrt(5);  // 定义变量:√5的值
    double f;            // 定义变量:存储计算结果

    cin >> n;            // 输入要计算的斐波那契数列项数

    // 计算黄金分割比例和其共轭数
    double a = (1 + t) / 2;  // 黄金分割比例 (1+√5)/2
    double b = (1 - t) / 2;  // 共轭比例 (1-√5)/2

    // 使用Binet公式计算第n项斐波那契数
    f = (pow(a, n) - pow(b, n)) / t;

    // 输出结果,保留两位小数
    printf("%.2f", f);

    return 0;            // 程序正常结束
}

【运行结果】

6
8.00
posted @ 2026-08-05 15:45  团爸讲算法  阅读(22)  评论(0)    收藏  举报