【C++】B2069 求分数序列和题目解析与优化详解
文章目录
- 💯前言
- 💯题目描述
- 输入格式
- 输出格式
- 输入输出样例
- 输入:
- 输出:
- 💯解题思路
- 分析题目
- 解题步骤
- 💯代码实现
- 我的代码实现
- 实现特点
- 老师的代码实现
- 实现特点
- 优点
- 缺点
- 💯对比分析
- 💯优化方案
- 改进点
- 💯小结
💯前言
- 本篇文章将详细解析洛谷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 n≤30)。
输出格式
输出一行浮点数,表示分数序列前 n n n 项之和,精确到小数点后4位。
输入输出样例
输入:
2
输出:
3.5000
💯解题思路
分析题目
-
递推关系:
- 序列的分子和分母满足递推关系:
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。
- 序列的分子和分母满足递推关系:
-
目标:
- 计算前 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
- 计算前 n n n 项的分数和:
-
数据范围:
- n ≤ 30 n \leq 30 n≤30,意味着序列递推和累加的规模较小,可以采用简单的迭代方式解决。
-
精度要求:
- 输出结果保留小数点后4位。
解题步骤
-
初始化变量:
- 定义两个变量分别表示分子 q q q 和分母 p p p。
- 定义一个变量 s u m sum sum 用于累加结果。
-
递推计算:
- 根据公式更新 q q q 和 p p p。
- 累加当前项的分数值: q p \frac{q}{p} pq。
-
输出结果:
- 使用浮点数输出,保留小数点后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;
}
实现特点
-
变量设计:
- 使用
z
表示当前分子,m
表示当前分母。 - 使用
temp
保存中间变量,避免覆盖数据。
- 使用
-
核心递推逻辑:
- q i + 1 = q i + p i q_{i+1} = q_i + p_i qi+1=qi+pi 用
z = z + m
实现。 - p i + 1 = q i p_{i+1} = q_i pi+1=qi 用
m = temp
实现。
- q i + 1 = q i + p i q_{i+1} = q_i + p_i qi+1=qi+pi 用
-
浮点数计算:
- 显式将
z / m
转换为浮点数计算,确保精度。
- 显式将
-
结果输出:
- 使用
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;
}
实现特点
-
变量优化:
- 直接使用
float
类型计算,避免临时变量。
- 直接使用
-
核心递推逻辑:
- 使用
q = q + p
和p = q - p
通过数学公式简化更新。
- 使用
-
结果输出:
- 同样使用
printf
保留4位小数。
- 同样使用
优点
-
代码简洁:
- 变量数量少,通过数学公式避免了中间变量。
-
逻辑紧凑:
- 更新
p
的方式非常简练,体现了数学上的优化。
- 更新
缺点
-
可读性较差:
p = q - p
的逻辑不够直观,对初学者不够友好。
-
精度问题:
- 使用
float
类型可能导致精度不足。
- 使用
💯对比分析
对比点 | 我的代码 | 老师的代码 |
---|---|---|
变量数量 | 多一个临时变量 temp | 仅用两个变量 q 和 p |
代码可读性 | 逻辑清晰,易于理解 | 数学简化逻辑不直观 |
浮点精度 | 使用 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;
}
改进点
-
精度提升:
- 使用
double
类型以提高浮点运算的精度。
- 使用
-
代码简化:
- 去掉了临时变量,简化逻辑。
-
现代化风格:
- 使用
cout
和setprecision
替代printf
,更符合 C++ 标准。
- 使用
💯小结
本题主要考察递推关系的理解与实现能力,同时对浮点数精度控制和代码优化提出了要求。在解题过程中,我们需要:
- 明确数列的递推关系。
- 合理设计变量以实现递推计算。
- 结合题目需求选择合适的浮点类型与输出方式。
通过对不同代码实现方案的比较与优化,我们不仅学会了更高效的解题方法,还理解了代码设计中的权衡取舍。希望本文能为读者提供帮助,在未来的编程学习中取得更大的进步!
相关文章:

【C++】B2069 求分数序列和题目解析与优化详解
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式输入输出样例输入:输出: 💯解题思路分析题目解题步骤 💯代码实现我的代码实现实现特点 老师的代码…...

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

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

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

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

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

tryhackme-Cyber Security 101-Linux Shells(linux命令框)
目的:了解脚本和不同类型的 Linux shell。 任务1:Introduction to Linux Shells(Linux Shell 简介) 作为操作系统的常规用户,我们都广泛使用图形用户界面 (GUI) 来执行大多数操作。只需点击几…...
亚远景-ISO 21434标准涵盖了哪些方面?
ISO 21434标准《道路车辆—网络安全工程》全面涵盖了汽车网络安全领域,其目的是确保汽车电子系统在整个产品生命周期中的网络安全性能。具体来说,该标准包括以下几个方面: 1. 术语和定义 :提供汽车网络安全相关的术语、概念和定义…...

第3章 集合与关系
2024年12月24日一稿 2024年12月26日二稿 🐰3.1 集合的概念和表示法 🦘3.1.1 集合的表示 🦘3.1.2 基本概念 🐰3.2 集合的运算 🦘3.2.1 集合的基本运算 🦘3.2.2 有穷计数集 🦘3.2.3 广义交和广义…...

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

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

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

详解下c语言中struct和union的对齐规则
接触过c语言的同学应该都知道字节对齐。有些时候我们很容易弄错字节对齐的方式,特别是涉及到struct(结构体)和union(联合体)时。今天我们通过详细例子来说明下struct和union的对齐规则,以便了解各种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(HTTP cookie)是一种存储在用户计算机上的小型文本文件。它由网站通过用户的浏览器在用户访问网站时创建,并存储一些用于跟踪和识别用户的信息。Cookie 主要用于在网站和浏览器之间传递数据,以便网站可以根据用户的…...

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

什么是 DevOps 自动化?
DevOps 自动化是一种现代软件开发方法,它使用工具和流程来自动化任务并简化工作流程。它将开发人员、IT 运营和安全团队聚集在一起,帮助他们有效协作并交付可靠的软件。借助 DevOps 自动化,组织能够处理重复性任务、优化流程并更快地将应用程…...
使用 Python 操作 MySQL 数据库的实用工具类:MySQLHandler
操作数据库是非常常见的需求,使用 Python 和 pymysql 库封装一个通用的 MySQL 数据库操作工具类,并通过示例演示如何使用这个工具类高效地管理数据库。 工具类的核心代码解析 MySQLHandler 类简介 MySQLHandler 是一个 Python 类,用于简化…...

DB-GPT V0.6.3 版本更新:支持 SiliconCloud 模型、新增知识处理工作流等
DB-GPT V0.6.3版本现已上线,快速预览新特性: 新特性 1. 支持 SiliconCloud 模型,让用户体验多模型的管理能力 如何使用: 修改环境变量文件.env,配置SiliconCloud模型 # 使用 SiliconCloud 的代理模型 LLM_MODELsiliconflow_p…...

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

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...