【C++】B2064 斐波那契数列

news2025/1/3 4:14:32

在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
      • 输入
      • 输出
  • 💯思路分析
    • **题目本质**
  • 💯代码实现与对比
    • **我的代码实现**
      • 代码展示
      • 思路解析
      • 优点
      • 不足
    • **老师的代码实现**
      • 代码展示
      • 思路解析
      • 优点
      • 不足
  • 💯优化方法
    • **优化方案:查表法**
      • 优化代码
      • 优化分析
  • 💯扩展与总结
    • **斐波那契数列的优化方法**
  • 💯 **小结**


在这里插入图片描述


💯前言

  • 斐波那契数列问题是算法学习中的经典例题。通过这一类问题,不仅可以巩固对递推关系和循环的理解,还能学习到如何通过预处理和查表优化代码效率。本次文章将通过一道具体的题目,从题目分析、代码实现、优化思路以及扩展应用四个部分,全面解析斐波那契数列问题的解决方法。
    C++ 参考手册
    在这里插入图片描述


💯题目描述

B2064 斐波那契数列
在这里插入图片描述

题目要求是计算斐波那契数列的第 a a a 项。数列的定义如下:

  • 第一项和第二项均为 1:
    F ( 1 ) = 1 , F ( 2 ) = 1 F(1) = 1, \quad F(2) = 1 F(1)=1,F(2)=1
  • n n n 项满足递推关系:
    F ( n ) = F ( n − 1 ) + F ( n − 2 ) (n ≥ 3) F(n) = F(n-1) + F(n-2) \quad \text{(n ≥ 3)} F(n)=F(n1)+F(n2)(n ≥ 3)

题目的输入输出格式如下:

输入格式

  • 第 1 行:测试数据的组数 n n n
  • 接下来 n n n 行,每行包含一个正整数 a a a,表示要求出斐波那契数列的第 a a a 项( 1 ≤ a ≤ 30 1 \leq a \leq 30 1a30)。

输出格式

  • 输出 n n n 行,每行对应一个输入 a a a 的结果。

输入输出样例

输入

4
5
10
30
1

输出

5
55
832040
1

💯思路分析

题目本质

斐波那契数列是一个经典的递推问题,通过递推公式 F ( n ) = F ( n − 1 ) + F ( n − 2 ) F(n) = F(n-1) + F(n-2) F(n)=F(n1)+F(n2) 可以不断计算出后续的项。对于这一问题,我们需要重点解决以下几点:

  1. 如何高效计算第 a a a 项?

    • 如果直接计算每个 a a a,复杂度较高,尤其是当 n n n a a a 较大时,会有很多重复计算。
    • 如果提前计算好数列的所有值,后续直接查表,则可以显著优化。
  2. 如何处理边界情况?

    • a = 1 a = 1 a=1 a = 2 a = 2 a=2 时,不需要递推,直接输出 1。
  3. 代码的简洁性与可读性

    • 变量的命名是否语义化,代码逻辑是否清晰。

💯代码实现与对比

以下我们对两种代码方案进行分析,一个是学生(你)的代码实现,另一个是老师提供的参考实现。

我的代码实现

代码展示

#include <iostream>
using namespace std;

int main() {
    int n;  // 测试数据组数
    cin >> n;

    while (n--) {  // 循环处理每组测试数据
        int a;
        cin >> a;

        // 边界情况
        if (a == 1 || a == 2) {
            cout << 1 << endl;
            continue;  // 直接输出后处理下一组测试数据
        }

        // 使用循环计算第 a 项
        int prev1 = 1, prev2 = 1;  // 前两项的值
        int current;  // 当前项的值
        for (int i = 3; i <= a; ++i) {  // 从第3项开始递推
            current = prev1 + prev2;  // 当前项等于前两项之和
            prev1 = prev2;  // 更新前两项的值
            prev2 = current;
        }

        cout << current << endl;  // 输出结果
    }

    return 0;
}

在这里插入图片描述

思路解析

  1. 边界条件处理
    • a = 1 a = 1 a=1 a = 2 a = 2 a=2 时,直接输出结果 1,无需循环计算。
  2. 递推计算
    • F ( 3 ) F(3) F(3) 开始循环,通过变量 prev1prev2 保存前两项的值,计算当前项。
  3. 变量使用
    • prev1prev2 分别保存前两项,current 保存当前项。

优点

  • 代码逻辑清晰,结构化程度高,适合扩展。
  • 边界情况单独处理,减少不必要的计算。

不足

  • 对每个输入 a a a 都需要从头计算,重复计算较多,效率不高。
  • 存在可以进一步优化的空间,例如使用查表法。

老师的代码实现

代码展示

#include <iostream>
using namespace std;

int main() {
    int n = 0;
    int a = 0;
    cin >> n;

    while (n--) {
        cin >> a;

        // 计算第 a 个斐波那契数
        int x = 1;
        int y = 1;
        int z = 1;
        while (a > 2) {
            z = x + y;
            x = y;
            y = z;
            a--;
        }

        cout << z << endl;
    }

    return 0;
}

在这里插入图片描述

思路解析

  1. 变量初始化
    • 定义了 x, y, 和 z 三个变量,分别表示前两项和当前项的值,初始值均为 1。
  2. 递推逻辑
    • 通过 while 循环,当 a > 2 a > 2 a>2 时,不断更新 xyz 的值。
    • 每次循环结束后,z 表示当前的第 a a a 项。
  3. 边界条件
    • 初始值的设置(均为 1)使得当 a = 1 a = 1 a=1 a = 2 a = 2 a=2 时,无需特殊处理。

优点

  • 代码紧凑简洁,没有显式的边界条件分支。
  • 循环逻辑简单直观。

不足

  • 和你的代码一样,没有解决重复计算的问题。
  • while 循环的使用虽然简化了逻辑,但对于大范围递推不如 for 循环明确。

💯优化方法

对于这类小范围的斐波那契问题,可以通过 查表法 显著优化计算效率。

优化方案:查表法

由于题目中 a a a 的范围固定( 1 ≤ a ≤ 30 1 \leq a \leq 30 1a30),我们可以提前计算好斐波那契数列的前 30 项,存入数组中。这样对于每个输入 a a a,只需直接查表输出即可。

优化代码

#include <iostream>
using namespace std;

int main() {
    // 预处理:计算斐波那契数列的前30项
    int fib[31];
    fib[1] = 1;
    fib[2] = 1;
    for (int i = 3; i <= 30; ++i) {
        fib[i] = fib[i - 1] + fib[i - 2];
    }

    int n;
    cin >> n;  // 输入测试组数

    while (n--) {
        int a;
        cin >> a;
        cout << fib[a] << endl;  // 查表输出
    }

    return 0;
}

在这里插入图片描述

优化分析

  1. 时间复杂度

    • 预处理:计算前 30 项的复杂度为 O ( 30 ) O(30) O(30)
    • 查询:每个输入直接查表,复杂度为 O ( 1 ) O(1) O(1)
    • 总复杂度为 O ( 30 + n ) O(30 + n) O(30+n),相较于直接递推的 O ( n ⋅ a max ) O(n \cdot a_{\text{max}}) O(namax) 大大降低。
  2. 空间复杂度

    • 需要额外的数组存储 30 项结果,但空间开销可以忽略不计。
  3. 优点

    • 避免了重复计算,运行效率显著提升。
    • 代码结构更简洁,易于维护。

💯扩展与总结

斐波那契数列的优化方法

  1. 矩阵快速幂

    • 斐波那契数列的递推可以转化为矩阵乘法,通过矩阵快速幂将时间复杂度降为 O ( log ⁡ n ) O(\log n) O(logn)
  2. 递归优化

    • 使用记忆化递归(Memoization)缓存中间结果,避免重复计算。

💯 小结

  • 题目解析:通过递推关系,明确了斐波那契数列的本质和边界条件。
  • 代码实现:比较了两种代码方案,分别分析了它们的优缺点。
  • 优化方法:通过查表法优化,解决了重复计算的问题,提高了效率。
  • 扩展思路:探讨了更高效的算法实现方式。

通过本次题目的解析,相信读者对斐波那契数列的计算和优化有了更深入的理解。在实际问题中,选择合适的算法与优化方法,能够显著提升代码的性能与可维护性。


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2268849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在 Ubuntu 24.04.1 LTS | Python 3.12 环境下部署 Crypto 库

测试一些密码学方案需要用到 Crypto 库&#xff0c;网上教程大多针对 Windows 和 Python 3.10 或以下的环境&#xff0c;所以写下了这篇博文。 部署与使用 首先执行 su 输入密码进入超级用户&#xff0c;部署完 Python 3.12 环境后&#xff0c;执行以下命令进行安装&#xff…

【ArcGIS Pro/GeoScene Pro】可视化时态数据

可视化过去二十年新西兰国际旅游业的发展变化 工程数据下载 ArcGIS Pro 快速入门指南—ArcGIS Pro | 文档 添加数据 数据为中国旅客数据 转置表字段 列数据转行数据

Junit4单元测试快速上手

文章目录 POM依赖引入业务层测试代码Web层测试代码生成测试类文件 在工作中我用的最多的单元测试框架是Junit4。通常在写DAO、Service、Web层代码的时候都会进行单元测试&#xff0c;方便后续编码&#xff0c;前端甩锅。 POM依赖引入 <dependency><groupId>org.spr…

HTML——24.图片引入1

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>图片的引入</title></head><body><!--网页中引入图片&#xff1a;使用img标签&#xff0c;<img src"图片路径"/>--><!--src属性…

云计算基础实验

云计算基础实验报告 实验一 Linux环境下算法的测试 一&#xff0c; 根据基本计算思想&#xff0c;验证和求解&#xff0c;设计算法。 根据运行需要&#xff0c;自行完成&#xff08;C和Python&#xff09;环境配置。 1.1验证卡布列克常数6174 原理过程&#xff1a; 循环输…

京东供应链创新与实践:应用数据驱动的库存选品和调拨算法提升履约效率

2024 年度总结系列 2024 年 10 月&#xff0c;京东零售供应链技术团队凭借其在库存选品与调拨技术上的创新与实践&#xff0c;荣获运筹与管理学领域的国际顶级奖项 Daniel H. Wagner Prize。本文为您介绍获奖背后的供应链技术创新和落地应用。 00 摘要 在电商行业中&#x…

按照人们阅读Excel习惯来格式化BigDecimal

1、环境/问题描述 使用springboot发送邮件(附件)的方式将月度报表发送给领导查阅&#xff0c;数据是准确的&#xff0c;领导基本满意。 就是对一些数字的格式化提出了改进建议&#xff0c;比如不要让大数字自动转为科学计数法、浮点数小数点后都是0就不要带出来&#xff0c;根…

软体机器人研究报告:设计方法、材料与驱动、感知与控制

软体机器人因其出色的可变形性和高适应性受到了广泛关注&#xff0c;这些特性使其在医疗、救援、探测等复杂场景中展现出独特的优势和巨大的应用潜力。研究人员对软体机器人的设计方法、材料与驱动技术、感知与控制策略等方面进行深入研究&#xff0c;取得了一系列成果。 本文汇…

医疗数仓业务数据采集与同步

业务数据采集与同步 业务采集组件配置业务数据同步概述数据同步策略选择数据同步工具概述1.1.4 全量表数据同步DataX配置文件生成全量表数据同步脚本增量表数据同步 MySQL - Maxwell - Kafka - Flume - HDFSMaxwell配置增量表首日全量同步 业务采集组件配置 Maxwell将业务采集到…

神经网络-VggNet

2014年VggNet被推出&#xff0c;获取了ILSVRC2014比赛分类项目的第二名&#xff0c;第一名是GoogleNet&#xff0c;该网络在下节介绍&#xff0c;本节主要介绍VggNet。 VggNet可以称为是一个家族&#xff0c;根据层数的不同包括了A、A-LRN、B、C、D等网络结构&#xff0c;其中…

计算机网络 (7)物理层下面的传输媒体

一、定义与位置 物理层是计算机网络体系结构的最低层&#xff0c;它位于传输媒体&#xff08;传输介质&#xff09;之上&#xff0c;主要作用是为数据链路层提供一个原始比特流的物理连接。这里的“比特流”是指数据以一个个0或1的二进制代码形式表示。物理层并不是特指某种传输…

敏捷开发中的自动化脚手架在 HarmonyOS 的应用

文章目录 前言什么是自动化脚手架工具构建自动化脚手架实战代码项目目录结构生成功能说明 示例代码生成功能说明 主工具类入口功能说明 如何运行脚手架工具总结参考资料 前言 在敏捷开发环境中&#xff0c;快速搭建项目结构是提升开发效率的关键。然而&#xff0c;手动配置开发…

VScode 格式化代码空格记录

点击 -> “文件” -> “首选项" -> “设置” -> 按下图操作&#xff1a; 怎么格式化代码空格&#xff0c;先看下&#xff1a; 保存代码后&#xff0c;这代码自动格式化发&#xff0c;如下图&#xff1a; 你可以试试看就即可

Python编程技术

设计目的 该项目框架Scrapy可以让我们平时所学的技术整合旨在帮助学习者提高Python编程技能并熟悉基本概念&#xff1a; 1. 学习基本概念&#xff1a;介绍Python的基本概念&#xff0c;如变量、数据类型、条件语句、循环等。 2. 掌握基本编程技巧&#xff1a;教授学生如何使…

《Java核心技术 卷II》流的创建

流的创建 Collection接口中stream方法可以将任何集合转换为一个流。 用静态Stream.of转化成数组。 Stream words Stream.of(contents.split("\\PL")); of方法具有可变长参数&#xff0c;可以构建具有任意数量的流。 使用Array.stream(array,from,to)可以用数组…

ESP32-CAM开发板入门 (下载示例程序)

ESP32-CAM开发板例程使用 1、准备工作1.1、硬件准备1.2、软件准备 2、选择示例程序并录入第一步 1、准备工作 1.1、硬件准备 1.2、软件准备 Arduino IDE &#xff1a; 编程与写入&#xff08;下载地址 https://www.arduino.cc/en/software&#xff09; 安装好后将软件设置到…

Cocos Creator 3.8.5 正式发布,更小更快更多平台!

在 Cocos Creator 3.8.5 版本中&#xff0c;我们做了新一轮的优化。 在加载速度、代码裁剪、平台增强等多方面做了优化&#xff0c;提升了开发者体验和游戏性能。 希望能够助 Cocos 开发者们的产品更上一层楼。 一、加载速度优化 1、WASM 模块延迟加载 在早期版本中&#xff0c…

HTML——30.视频引入

<head><meta charset"UTF-8"><title>视频引入</title></head><body><!--video:在网页中引入音频IE8以及之前版本不支持属性名和属性值一样&#xff0c;可以只写属性名src属性:指定视频文件路径&#xff0c;必须要有controls属…

T7 TensorFlow入门实战——咖啡豆识别

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習紀錄博客&#x1f356; 原作者&#xff1a;K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import numpy as np import PIL,pathlib from PIL import Image import ma…

OpenHarmony源码编译后烧录镜像教程,RK3566鸿蒙开发板演示

本文介绍瑞芯微主板/开发板编译OpenHarmony源码后烧录镜像的教程&#xff0c;触觉智能Purple Pi OH鸿蒙开发板演示。搭载了瑞芯微RK3566四核处理器&#xff0c;树莓派卡片电脑设计&#xff0c;支持开源鸿蒙OpenHarmony3.2-5.0系统&#xff0c;适合鸿蒙开发入门学习。 编译源码…