文章

【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$。


题目分析

解题思路

  1. 首先,我们需要理解题目的核心要求:
    • 输入一个自然数 n
    • 计算斐波那契数列的第 n 项
    • 结果需要保留两位小数
  2. 解题思路:
    • 基本方法:
      • 使用斐波那契数列的通项公式直接计算
      • 公式:$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 进行授权