【GESP】C++二级练习 luogu-P1720 月落乌啼算钱(斐波那契数列)
GESP二级练习,数学函数练习,难度★☆☆☆☆。
luogu-P1720 月落乌啼算钱(斐波那契数列)
题目要求
题目描述
算完钱后,月落乌啼想着:“你坑我!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第 $n$ 样菜价格多少?”月落乌啼写出了:
\[F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{5}}\]由于爱与愁大神学过编程,于是就用 $1$ 分钟的时间求出了 $F_n$ 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出 $F_n$ 的值吗?
输入格式
一行一个自然数 $n$。
输出格式
只有 $1$ 行一个实数 $F_n$,保留两位小数。
输入 #1
1
6
输出 #1
1
8.00
说明/提示
对于所有数据:$0 \leq n\leq 48$。
题目分析
解题思路
- 首先,我们需要理解题目的核心要求:
- 输入一个自然数 n
- 计算斐波那契数列的第 n 项
- 结果需要保留两位小数
- 解题思路:
- 基本方法:
- 使用斐波那契数列的通项公式直接计算
- 公式:$F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{5}}$
- 实现步骤:
- 获取输入的自然数 n
- 计算公式中的两个幂次项
- 将结果相减后除以根号5
- 按要求格式化输出
- 优化考虑:
- 使用 double 类型保证计算精度
- 使用 cmath 库中的 pow 和 sqrt 函数进行计算
- 时间复杂度:
- O(1),使用通项公式可以直接计算结果
- 特殊情况:
- 由题目限制条件可知,0 ≤ n ≤ 48,不需要考虑过大数值的情况
- 基本方法:
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
int main() {
// 读取输入的n
int n;
cin >> n;
// 计算斐波那契数列通项公式中的第一项:(1+√5)/2的n次方
double u = pow(((1 + sqrt(5)) / 2), n);
// 计算斐波那契数列通项公式中的第二项:(1-√5)/2的n次方
double y = pow(((1 - sqrt(5)) / 2), n);
// 计算最终结果:两项之差除以√5
double fn = (u - y) / sqrt(5);
// 按照题目要求输出保留两位小数的结果
printf("%.2f", fn);
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权