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

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

GESP二级练习,数学函数练习,难度★☆☆☆☆。

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

题目要求

题目描述

算完钱后,月落乌啼想着:“你坑我!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第 nn 样菜价格多少?”月落乌啼写出了:

Fn=(1+52)n(152)n5F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{5}}

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

输入格式

一行一个自然数 nn

输出格式

只有 11 行一个实数 FnF_n,保留两位小数。

输入 #1

6

输出 #1

8.00

说明/提示

对于所有数据:0n480 \leq n\leq 48


题目分析

解题思路

  1. 首先,我们需要理解题目的核心要求:

    • 输入一个自然数 n
    • 计算斐波那契数列的第 n 项
    • 结果需要保留两位小数
  2. 解题思路:

    • 基本方法:
      • 使用斐波那契数列的通项公式直接计算
      • 公式:Fn=(1+52)n(152)n5F_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,不需要考虑过大数值的情况

{% include custom/custom-post-content-inner.html %}


示例代码

#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;
}

{% include custom/custom-post-content-footer.md %}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
Last updated on