当前位置: 首页 > news >正文

【C++】B2069 求分数序列和题目解析与优化详解


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目描述
    • 输入格式
    • 输出格式
    • 输入输出样例
      • 输入:
      • 输出:
  • 💯解题思路
    • 分析题目
    • 解题步骤
  • 💯代码实现
    • 我的代码实现
      • 实现特点
    • 老师的代码实现
      • 实现特点
      • 优点
      • 缺点
  • 💯对比分析
  • 💯优化方案
      • 改进点
  • 💯小结


在这里插入图片描述


💯前言

  • 本篇文章将详细解析洛谷B2069题“求分数列和”的解题过程,包括题目的详细描述、解题思路、不同代码实现方案的比较与优化,以及对相关概念的深入拓展。文章的目标是帮助读者全面掌握此类题目的解法,并提升在C++编程中的逻辑分析与代码优化能力。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

B2069 求分数序列和
在这里插入图片描述

有一个分数序列:

q 1 p 1 , q 2 p 2 , q 3 p 3 , q 4 p 4 , ⋯ \frac{q_1}{p_1}, \frac{q_2}{p_2}, \frac{q_3}{p_3}, \frac{q_4}{p_4}, \cdots p1q1,p2q2,p3q3,p4q4,

其中,满足递推关系:

  • q i + 1 = q i + p i q_{i+1} = q_i + p_i qi+1=qi+pi
  • p i + 1 = q i p_{i+1} = q_i pi+1=qi
  • 初始值 q 1 = 2 q_1 = 2 q1=2, p 1 = 1 p_1 = 1 p1=1

例如,前6项依次为:
2 1 , 3 2 , 5 3 , 8 5 , 13 8 , 21 13 \frac{2}{1}, \frac{3}{2}, \frac{5}{3}, \frac{8}{5}, \frac{13}{8}, \frac{21}{13} 12,23,35,58,813,1321

任务是计算分数序列前 n n n 项的和。结果保留4位小数。

输入格式

输入一行包含一个正整数 n n n n ≤ 30 n \leq 30 n30)。

输出格式

输出一行浮点数,表示分数序列前 n n n 项之和,精确到小数点后4位。

输入输出样例

输入:

2

输出:

3.5000

💯解题思路

分析题目

  1. 递推关系

    • 序列的分子和分母满足递推关系:
      q i + 1 = q i + p i q_{i+1} = q_i + p_i qi+1=qi+pi
      p i + 1 = q i p_{i+1} = q_i pi+1=qi
    • 初始条件为 q 1 = 2 q_1 = 2 q1=2, p 1 = 1 p_1 = 1 p1=1
  2. 目标

    • 计算前 n n n 项的分数和:
      sum = q 1 p 1 + q 2 p 2 + ⋯ + q n p n \text{sum} = \frac{q_1}{p_1} + \frac{q_2}{p_2} + \cdots + \frac{q_n}{p_n} sum=p1q1+p2q2++pnqn
  3. 数据范围

    • n ≤ 30 n \leq 30 n30,意味着序列递推和累加的规模较小,可以采用简单的迭代方式解决。
  4. 精度要求

    • 输出结果保留小数点后4位。

解题步骤

  1. 初始化变量

    • 定义两个变量分别表示分子 q q q 和分母 p p p
    • 定义一个变量 s u m sum sum 用于累加结果。
  2. 递推计算

    • 根据公式更新 q q q p p p
    • 累加当前项的分数值: q p \frac{q}{p} pq
  3. 输出结果

    • 使用浮点数输出,保留小数点后4位。

💯代码实现

我的代码实现

以下是我的代码实现:

#include <iostream>
#include <cstdio>
using namespace std;int main() {double sum = 0; // 累加和,双精度浮点数int n = 0, temp = 0;int z = 2, m = 1; // 初始化分子和分母cin >> n;for (int i = 0; i < n; i++) {sum += z * 1.0 / m; // 累加当前项temp = z;           // 暂存当前分子z = z + m;          // 计算新的分子m = temp;           // 更新分母为旧的分子}printf("%.4lf", sum); // 输出结果,保留 4 位小数return 0;
}

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

实现特点

  1. 变量设计

    • 使用 z 表示当前分子,m 表示当前分母。
    • 使用 temp 保存中间变量,避免覆盖数据。
  2. 核心递推逻辑

    • q i + 1 = q i + p i q_{i+1} = q_i + p_i qi+1=qi+piz = z + m 实现。
    • p i + 1 = q i p_{i+1} = q_i pi+1=qim = temp 实现。
  3. 浮点数计算

    • 显式将 z / m 转换为浮点数计算,确保精度。
  4. 结果输出

    • 使用 printf 保留4位小数。

老师的代码实现

以下是老师给出的代码实现:

#include <iostream>
#include <cstdio> // 用于 printf
using namespace std;int main() {int n = 0;cin >> n;float sum = 0; // 累加和,浮点类型float q = 2;   // 初始化分子 qfloat p = 1;   // 初始化分母 pfor (int i = 0; i < n; i++) {sum += q / p; // 累加当前项q = q + p;    // 计算新的 qp = q - p;    // 计算新的 p}printf("%.4f\n", sum); // 输出结果,保留 4 位小数return 0;
}

在这里插入图片描述

在这里插入图片描述

实现特点

  1. 变量优化

    • 直接使用 float 类型计算,避免临时变量。
  2. 核心递推逻辑

    • 使用 q = q + pp = q - p 通过数学公式简化更新。
  3. 结果输出

    • 同样使用 printf 保留4位小数。

优点

  1. 代码简洁

    • 变量数量少,通过数学公式避免了中间变量。
  2. 逻辑紧凑

    • 更新 p 的方式非常简练,体现了数学上的优化。

缺点

  1. 可读性较差

    • p = q - p 的逻辑不够直观,对初学者不够友好。
  2. 精度问题

    • 使用 float 类型可能导致精度不足。

💯对比分析

对比点我的代码老师的代码
变量数量多一个临时变量 temp仅用两个变量 qp
代码可读性逻辑清晰,易于理解数学简化逻辑不直观
浮点精度使用 double,精度更高使用 float,精度稍低
内存使用稍高,多用了一个变量更低,只用了必要的变量
实现复杂度适中,易于实现和调试较低,但对理解有一定要求

💯优化方案

结合两者的优点,我们可以进一步优化代码:

#include <iostream>
#include <iomanip> // 用于控制输出精度
using namespace std;int main() {int n;cin >> n;double sum = 0.0; // 使用 double 提高精度int q = 2, p = 1; // 分子和分母初始化for (int i = 0; i < n; i++) {sum += static_cast<double>(q) / p; // 显式类型转换q = q + p; // 直接更新分子p = q - p; // 通过差值更新分母}cout << fixed << setprecision(4) << sum << endl; // 使用现代化流输出return 0;
}

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

改进点

  1. 精度提升

    • 使用 double 类型以提高浮点运算的精度。
  2. 代码简化

    • 去掉了临时变量,简化逻辑。
  3. 现代化风格

    • 使用 coutsetprecision 替代 printf,更符合 C++ 标准。

💯小结

本题主要考察递推关系的理解与实现能力,同时对浮点数精度控制和代码优化提出了要求。在解题过程中,我们需要:

  1. 明确数列的递推关系。
  2. 合理设计变量以实现递推计算。
  3. 结合题目需求选择合适的浮点类型与输出方式。

通过对不同代码实现方案的比较与优化,我们不仅学会了更高效的解题方法,还理解了代码设计中的权衡取舍。希望本文能为读者提供帮助,在未来的编程学习中取得更大的进步!


在这里插入图片描述


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

相关文章:

【C++】B2069 求分数序列和题目解析与优化详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式输出格式输入输出样例输入&#xff1a;输出&#xff1a; &#x1f4af;解题思路分析题目解题步骤 &#x1f4af;代码实现我的代码实现实现特点 老师的代码…...

4.FPGA如何实现设计

在前面分别引入了&#xff0c;LUT的知识&#xff0c;全局时钟网络&#xff0c;以及FPGA内部的资源。 LUT的知识&#xff1a; 在FPGA设计中实现的逻辑运算在不借用其他的硬核的基础上都是在LUT中通过查表的方式进行完成的&#xff0c;比如实现的c a & b;就是将a&b的所…...

SO-CNN-LSTM-MATT蛇群算法优化注意力机制深度学习多特征分类预测

SO-CNN-LSTM-MATT蛇群算法优化注意力机制深度学习多特征分类预测&#xff08;多输入单输出&#xff09; 目录 SO-CNN-LSTM-MATT蛇群算法优化注意力机制深度学习多特征分类预测&#xff08;多输入单输出&#xff09;分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matl…...

大模型-Ollama使用相关的笔记

大模型-Ollama使用相关的笔记 解决Ollama外网访问问题&#xff08;配置ollama跨域访问&#xff09;Postman请求样例 解决Ollama外网访问问题&#xff08;配置ollama跨域访问&#xff09; 安装Ollama完毕后&#xff0c; /etc/systemd/system/ollama.service进行如下修改&#…...

OpenCV计算机视觉 02 图片修改 图像运算 边缘填充 阈值处理

目录 图片修改&#xff08;打码、组合、缩放&#xff09; 图像运算 边缘填充 ​阈值处理 上一篇文章&#xff1a; OpenCV计算机视觉 01 图像与视频的读取操作&颜色通道 图片修改&#xff08;打码、组合、缩放&#xff09; # 图片打码 import numpy as np a cv2.imre…...

langchain使用FewShotPromptTemplate出现KeyError的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

tryhackme-Cyber Security 101-Linux Shells(linux命令框)

目的&#xff1a;了解脚本和不同类型的 Linux shell。 任务1&#xff1a;Introduction to Linux Shells&#xff08;Linux Shell 简介&#xff09; 作为操作系统的常规用户&#xff0c;我们都广泛使用图形用户界面 &#xff08;GUI&#xff09; 来执行大多数操作。只需点击几…...

亚远景-ISO 21434标准涵盖了哪些方面?

ISO 21434标准《道路车辆—网络安全工程》全面涵盖了汽车网络安全领域&#xff0c;其目的是确保汽车电子系统在整个产品生命周期中的网络安全性能。具体来说&#xff0c;该标准包括以下几个方面&#xff1a; 1. 术语和定义 &#xff1a;提供汽车网络安全相关的术语、概念和定义…...

第3章 集合与关系

2024年12月24日一稿 2024年12月26日二稿 &#x1f430;3.1 集合的概念和表示法 &#x1f998;3.1.1 集合的表示 &#x1f998;3.1.2 基本概念 &#x1f430;3.2 集合的运算 &#x1f998;3.2.1 集合的基本运算 &#x1f998;3.2.2 有穷计数集 &#x1f998;3.2.3 广义交和广义…...

【vmware】|设置共享文件夹

目的: 虚拟机中设置共享文件夹&#xff0c;本地物理机中可以搜到该共享文件夹 1、虚拟机&#xff1a; 设置共享文件夹 右键属性-共享页码进行下列设置 点击网络和共享中心&#xff0c;检查下列选项 二、在本地物理机中启用网络发现&#xff1a; 此时&#xff0c;刷新网络…...

Log4j1.27配置日志输出级别不起效

起因&#xff1a;构建独立版本debezuim使用时&#xff0c;日志一直打印debug信息。 原因&#xff1a;包冲突问题&#xff0c;进行排包操作。 参考log4j日志级别配置完成后不生效 系统一直打印debug日志_log4j不起作用-CSDN博客 1、application.properties logging.configc…...

计算机图形学知识点汇总

一、计算机图形学定义与内容 1.图形 图形分为“图”和“形”两部分。 其中&#xff0c;“形”指形体或形状&#xff0c;存在于客观世界和虚拟世界&#xff0c;它的本质是“表示”&#xff1b;而图则是包含几何信息与属性信息的点、线等基本图元构成的画面&#xff0c;用于表达…...

详解下c语言中struct和union的对齐规则

接触过c语言的同学应该都知道字节对齐。有些时候我们很容易弄错字节对齐的方式&#xff0c;特别是涉及到struct&#xff08;结构体&#xff09;和union&#xff08;联合体&#xff09;时。今天我们通过详细例子来说明下struct和union的对齐规则&#xff0c;以便了解各种struct和…...

ubuntu安装sublime安装与免费使用

1. ubuntu安装sublime 参考官网: Linux Package Manager Repositories 2. 破解过程 打开如下网址,打开/opt/sublime_text/sublime_text https://hexed.it/ 3. 替换在hexed打开的文件中查找并替换: 4180激活方法 使用二进制编辑器 8079 0500 0f94 c2替换为 c641 05…...

攻防世界 cookie

开启场景 Cookie&#xff08;HTTP cookie&#xff09;是一种存储在用户计算机上的小型文本文件。它由网站通过用户的浏览器在用户访问网站时创建&#xff0c;并存储一些用于跟踪和识别用户的信息。Cookie 主要用于在网站和浏览器之间传递数据&#xff0c;以便网站可以根据用户的…...

深度学习笔记1:神经网络与模型训练过程

参考博客&#xff1a;PyTorch深度学习实战&#xff08;1&#xff09;——神经网络与模型训练过程详解_pytorch 实战-CSDN博客 人工神经网络 ANN&#xff1a;张量及数学运算的集合&#xff0c;排列方式近似于松散的人脑神经元排列 组成 1&#xff09;输入层 2&#xff09;隐…...

什么是 DevOps 自动化?

DevOps 自动化是一种现代软件开发方法&#xff0c;它使用工具和流程来自动化任务并简化工作流程。它将开发人员、IT 运营和安全团队聚集在一起&#xff0c;帮助他们有效协作并交付可靠的软件。借助 DevOps 自动化&#xff0c;组织能够处理重复性任务、优化流程并更快地将应用程…...

使用 Python 操作 MySQL 数据库的实用工具类:MySQLHandler

操作数据库是非常常见的需求&#xff0c;使用 Python 和 pymysql 库封装一个通用的 MySQL 数据库操作工具类&#xff0c;并通过示例演示如何使用这个工具类高效地管理数据库。 工具类的核心代码解析 MySQLHandler 类简介 MySQLHandler 是一个 Python 类&#xff0c;用于简化…...

DB-GPT V0.6.3 版本更新:支持 SiliconCloud 模型、新增知识处理工作流等

DB-GPT V0.6.3版本现已上线&#xff0c;快速预览新特性: 新特性 1. 支持 SiliconCloud 模型&#xff0c;让用户体验多模型的管理能力 如何使用&#xff1a; 修改环境变量文件.env&#xff0c;配置SiliconCloud模型 # 使用 SiliconCloud 的代理模型 LLM_MODELsiliconflow_p…...

亚式期权定价模型Turnbull-Wakeman进行delta对冲

Turnbull-Wakeman Model是一种用于定价和对冲亚式期权的数学模型。该模型由David Turnbull和Keith Wakeman在1990年提出&#xff0c;用于解决亚式期权的定价问题。 亚式期权是一种路径依赖类型的期权&#xff0c;其期权价格与标的资产价格某个期间内的平均值有关&#xff0c;假…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...