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

由于爱与愁大神学过编程,于是就用 \(1\) 分钟的时间求出了 \(F_n\) 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出 $F_n $ 的值吗?
【输入】
一行一个自然数 \(n\)。
【输出】
只有 \(1\) 行一个实数 \(F_n\),保留两位小数。
【输入样例】
6
【输出样例】
8.00
【核心思想】
-
问题分析:求斐波那契数列第 \(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]\)。
-
算法选择:
- 比内公式直接计算:利用黄金分割比例 \(\phi = \frac{1+\sqrt{5}}{2}\) 及其共轭 \(\hat{\phi} = \frac{1-\sqrt{5}}{2}\),直接代入公式计算第 \(n\) 项
-
关键步骤:
- 读入数据:
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)保留两位小数
- 读入数据:
-
时间/空间复杂度:
- 时间复杂度:\(O(1)\),固定次数的数学运算
- 空间复杂度:\(O(1)\),仅需常数个变量
-
闭式解的核心思想:
- 比内公式:斐波那契数列的通项公式,将递推问题转化为直接的幂运算
- 黄金分割比例:\(\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
浙公网安备 33010602011771号