【C++】编程题目分析与实现回顾:从浮点数运算到整型转换的全面解读


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目一:计算成绩
    • 问题分析与优化实现
    • 优化后的实现优势
  • 💯题目二:浮点数向零舍入
    • 不同实现方式的比较
      • 1. 使用强制类型转换 `(int)`
      • 2. 使用标准库函数 `trunc()`
    • 整数范围的处理
  • 💯小结


在这里插入图片描述


💯前言

  • 在本次对话中,我们详细讨论了关于 C++编程题目 中的若干关键问题,包括 权重加权的计算浮点数的处理向零舍入 的实现方式,以及如何处理 大范围整数 的计算。这些讨论在涉及 基础实现优化 的过程中,不仅探讨了技术实现,还涵盖了相关设计决策的 理论依据。以下内容系统地整理了这次对话的思路和方法,以便完整呈现 解决问题的过程 和背后的逻辑。
    C++ 参考手册
    在这里插入图片描述

💯题目一:计算成绩

计算成绩
在这里插入图片描述

题目描述

牛牛最近学习了C++入门课程,这门课程的总成绩计算方法如下:

总成绩 = 作业成绩×20% + 小测成绩×30% + 期末考试成绩×50%

牛牛很想知道,这门课程最后他能得到多少分。

输入格式

输入只有一行,包含三个非负整数,分别表示牛牛的作业成绩、小测成绩和期末考试成绩。每项得分数范围从0到100,且三项成绩满分都是100分。

输出格式

输出只有一行,包含一个整数,表示牛牛的总成绩,满分也是100分。

输入输出样例

示例1

输入:
100 100 80
输出:
90

解释:牛牛的作业成绩是100分,小测成绩是100分,期末考试成绩是80分,总成绩为: 100×20% + 100×30% + 80×50% = 20 + 30 + 40 = 90。

示例2

输入:
60 90 80
输出:
79

解释:牛牛的作业成绩是60分,小测成绩是90分,期末考试成绩是80分,总成绩为: 60×20% + 90×30% + 80×50% = 12 + 27 + 40 = 79。
备注

对于 30% 的数据,A=B=0。

对于另外 30% 的数据,A=B=100。

对于 100% 的数据,0≤A, B, C≤100 且 A, B, C 都是 10 的整数倍。


问题分析与优化实现

  1. 浮点数运算与整数运算

在初步讨论中,我们首先实现了一个简单的解决方案,即使用浮点数来计算总成绩,代码如下:

#include <iostream>
using namespace std;int main() {int a, b, c;cin >> a >> b >> c;cout << a * 0.2 + b * 0.3 + c * 0.5 << endl;return 0;
}

在这里插入图片描述

在上述代码中,我们直接使用浮点数(0.20.30.5)来进行加权计算,并输出结果。然而,这种实现方式可能存在一个问题,即 浮点数运算带来的精度问题,尤其是在需要严格保证计算结果为 整数 时。

为了消除 浮点数精度 带来的潜在误差,我们对代码进行了优化,将所有计算转换为 整数运算。具体思路是将权重从浮点数(20%30%50%)改为 整数比例203050),然后在计算完后除以 100 来得到最终结果,代码如下:

#include <iostream>
using namespace std;int main() {int a, b, c;cin >> a >> b >> c;// 使用整数运算,避免浮点数精度问题int total_score = a * 20 + b * 30 + c * 50;total_score /= 100;cout << total_score << endl;return 0;
}

在这里插入图片描述

这种 整数运算 的实现不仅更加 高效,而且消除了浮点数运算中由于 二进制表示的限制 而产生的 精度误差,使得计算结果更加 可靠

  1. 老师的做法:使用强制类型转换

在课堂上,老师选择了另一种实现方式,即通过将浮点数的计算结果进行强制类型转换来实现。其代码如下:

#include <iostream>
using namespace std;int main() {int a, b, c;cin >> a >> b >> c;// 使用浮点数计算并进行强制类型转换int total_score = (int)(a * 0.2 + b * 0.3 + c * 0.5); // 这里的 (a * 0.2 + b * 0.3 + c * 0.5) 计算结果是 double 类型,表示浮点数运算结果。cout << total_score << endl;return 0;
}

在这里插入图片描述

在这种做法中,老师使用了 (int) 强制将浮点数结果转换为整数。这是因为 (a * 0.2 + b * 0.3 + c * 0.5) 的计算结果是 double 类型,即浮点数类型,而通过 (int) 强制类型转换可以将浮点数截断为整数部分(即舍弃小数部分)。这种方法的优点在于代码相对简单,不需要调整权重的表示方式。然而,采用 浮点数计算 加上 强制类型转换 的方式,仍然可能由于 浮点数本身的精度问题 导致不精确的计算结果,特别是在 累积误差较大 的情况下。


优化后的实现优势

在这里插入图片描述

  1. 避免精度问题整数运算 避免了浮点数精度不足的问题,确保结果的 准确性

  2. 简洁高效整数运算 通常比浮点数运算更 高效,尤其是在需要对 大数据量 进行操作时。


💯题目二:浮点数向零舍入

  • 浮点数向零舍入
    在这里插入图片描述

接下来,我们讨论了一个关于浮点数向零舍入的问题。题目要求输入一个双精度浮点数,将其“向零舍入”到最接近的整数。

题目描述

输入一个双精度浮点数,要求将其向零舍入为整数。所谓向零舍入,即对正数向下取整,对负数向上取整。

输入格式

一个双精度浮点数。

输出格式

一个整数,即向零舍入后的结果。

输入输出样例

示例

输入:
2.3
输出:
2

不同实现方式的比较


1. 使用强制类型转换 (int)

在初步实现中,我们使用了 (int) 强制类型转换来实现向零舍入的效果:

#include <iostream>
using namespace std;int main() {double x;cin >> x;int num = (int)x;cout << num << endl;return 0;
}

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

这种做法将浮点数的小数部分直接截断,对于正数和负数均适用。例如:

  • 输入 2.3,输出 2
  • 输入 -2.3,输出 -2

这种实现方式的优点是简单直接,但在表达向零舍入的意图上不够明确。


2. 使用标准库函数 trunc()

为了更清晰地表达向零舍入的意图,我们推荐使用 <cmath> 中的 trunc() 函数:

#include <iostream>
#include <cmath> // 包含 trunc 函数
using namespace std;int main() {double x;cin >> x;long long num = trunc(x);cout << num << endl;return 0;
}

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

trunc() 函数的作用是对浮点数进行“向零舍入”,无论输入是正数还是负数,结果都与 (int) 转换相同。但使用 trunc() 更加清晰地表达了开发者的意图,使代码的可读性更强。


整数范围的处理

我们还讨论了数据范围的问题。题目要求处理的输入范围可能达到 − 1 0 15 ≤ x ≤ 1 0 15 -10^{15} \leq x \leq 10^{15} 1015x1015。由于 int 的范围是约 − 2 i m e s 1 0 9 -2 imes 10^9 2imes109 2 i m e s 1 0 9 2 imes 10^9 2imes109,显然不足以处理如此大的数字。因此,我们需要使用 long long 类型来存储结果。

修改后的代码如下:

#include <iostream>
using namespace std;int main() {double x;cin >> x;long long num = (long long)x; // 使用 long long 存储结果cout << num << endl;return 0;
}

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

使用 long long 可以处理范围更大的整数,确保在极端输入情况下不会溢出。


💯小结

  • 在这里插入图片描述
    在这次对话中,我们通过解决两个 C++编程题,深入探讨了 浮点数运算的精度问题向零舍入 的不同实现方式,以及 大数范围的处理。以下是关键点总结:
  1. 加权成绩计算的优化:通过使用 整数运算 代替 浮点数运算,避免 精度问题,简化代码逻辑。

  2. 向零舍入的实现:可以使用 (int) 强制类型转换实现,也可以使用 trunc() 函数,更加清晰地表达意图。

  3. 数据范围的考虑:当输入数据范围较大时,应使用合适的数据类型,如 long long,以避免 溢出问题


在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间表格Java

输入&#xff1a;XXX XXX 小时 分钟 输出&#xff1a; XXX&#xff1a;XXX ~ XXX: XXX XXX&#xff1a;XXX ~ XXX: XXX XXX&#xff1a;XXX ~ XXX: XXX 处理&#xff1a;间隔五分钟、区间45分钟 14:15 ~ 15:0 15:5 ~ 15:50 15:55 ~ 16:40 16:45 ~ 17:30 17:35 ~ 18:20…

Spring AOP 的实现和切点表达式的介绍

1. 快速入手 AOP&#xff1a;就是面相切面编程&#xff0c;切面指的就是某一类特定的问题&#xff0c;也可以理解为面相特定方法编程&#xff0c;例如之前使用的拦截器&#xff0c;就是 AOP 思想的一种应用&#xff0c;统一数据返回格式和统一异常处理也是 AOP 思想的实现方式…

shell脚本30个案例(五)

前言&#xff1a; 通过一个多月的shell学习&#xff0c;总共写出30个案例&#xff0c;分批次进行发布&#xff0c;这次总共发布了5个案例&#xff0c;希望能够对大家的学习和使用有所帮助&#xff0c;更多案例会在下期进行发布。 案例二十一、系统内核优化 1.问题&#xff1…

一文解析Kettle开源ETL工具!

ETL&#xff08;Extract, Transform, Load&#xff09;工具是用于数据抽取、转换和加载的软件工具&#xff0c;用于支持数据仓库和数据集成过程。Kettle作为传统的ETL工具备受用户推崇。本文就来详细说下Kettle。 一、Kettle是什么&#xff1f; Kettle 是一款开源的 ETL&#x…

IDEA使用HotSwapHelper进行热部署

目录 前言JDK1.8特殊准备DECVM安装插件安装与配置参考文档相关下载 前言 碰到了一个项目&#xff0c;用jrebel启动项目时一直报错&#xff0c;不用jrebel时又没问题&#xff0c;找不到原因&#xff0c;又不想放弃热部署功能 因此思考能否通过其他方式进行热部署&#xff0c;找…

使用无监督机器学习算法进行预测性维护

目录 一、说明 二、主成分分析&#xff08;PCA&#xff09; 三、 K-means方法 四、K-最近邻 (KNN) 五、密度的空间聚类 (DBSCAN) 六、更先进的预测性维护算法 6.1 独立成分分析 (ICA) 6.2 PCA 和 ICA 有什么区别&#xff1f; 6.3 OPTICS 聚类 6.4 自组织映射 (SOM) 6.5 局部敏…

Elasticsearch 进阶

核心概念 索引(Index) 一个索引就是一个拥有几分相似特征的文档的集合。比如说&#xff0c;你可以有一个客户数据的索引&#xff0c;另一个产品目录的索引&#xff0c;还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母)&#xff0c;并且当我们要对这个索…

107.【C语言】数据结构之二叉树求总节点和第K层节点的个数

目录 1.求二叉树总的节点的个数 1.容易想到的方法 代码 缺陷 思考:能否在TreeSize函数内定义静态变量解决size的问题呢? 其他写法 运行结果 2.最好的方法:分而治之 代码 运行结果 2.求二叉树第K层节点的个数 错误代码 运行结果 修正 运行结果 其他写法 1.求二…

vue2 虚拟DOM 和 真实DOM (概念、作用、Diff 算法)

虚拟 DOM 和 真实DOM&#xff08;概念、作用、Diff 算法&#xff09; 1.1 概念 真实 DOM&#xff08;Document Object Model&#xff09;&#xff1a;是浏览器中用于表示文档结构的树形结构。 <h2>你好</h2>虚拟DOM&#xff1a;用 JavaScript 对象来模拟真实 DOM…

Spring AI 框架介绍

Spring AI是一个面向人工智能工程的应用框架。它的目标是将Spring生态系统的设计原则&#xff08;如可移植性和模块化设计&#xff09;应用于AI领域&#xff0c;并推广使用pojo作为AI领域应用的构建模块。 概述 Spring AI 现在(2024/12)已经支持语言&#xff0c;图像&#xf…

matlab 中的 bug

在matlab中绘图&#xff0c;设置 axe 的背景颜色 axes_in3.Color #00235B ;打印的时候 print(figure_handle1,-dpng,-r300,"merge_yt_ey") ;此时保存的图片无法识别背景颜色 原因在于 matlab 中的 InverseHardcopy 将 InvertHardcopy 设置成 off 则可以解决这个问…

【数据库系列】Liquibase 与 Flyway 的详细对比

在现代软件开发中&#xff0c;数据库版本控制是一个至关重要的环节。为了解决数据库迁移和变更管理的问题&#xff0c;开发者们通常会使用工具&#xff0c;如 Liquibase 和 Flyway。本文将对这两个流行的数据库迁移工具进行详细比较&#xff0c;从基础概念、原理、优缺点到使用…

DVWA靶场通关——DOM型XSS漏洞

一、DOM型XSS攻击概述 DOM型XSS&#xff08;DOM-based Cross-Site Scripting&#xff0c;DOM XSS&#xff09;是一种跨站脚本攻击&#xff08;XSS&#xff09;的变种&#xff0c;它与传统的反射型XSS&#xff08;Reflected XSS&#xff09;或存储型XSS&#xff08;Stored XSS&a…

flink学习(14)—— 双流join

概述 Join:内连接 CoGroup&#xff1a;内连接&#xff0c;左连接&#xff0c;右连接 Interval Join&#xff1a;点对面 Join 1、Join 将有相同 Key 并且位于同一窗口中的两条流的元素进行关联。 2、Join 可以支持处理时间&#xff08;processing time&#xff09;和事件时…

设计模式——Facade(门面)设计模式

摘要 本文介绍了外观设计模式&#xff0c;这是一种通过简单接口封装复杂系统的设计模式。它简化了客户端与子系统之间的交互&#xff0c;降低了耦合度&#xff0c;并提供了统一的调用接口。文章还探讨了该模式的优缺点&#xff0c;并提供了类图实现和使用场景。 1. 外观设计模…

泷羽sec-burp功能介绍(1) 学习笔记

声明&#xff01; 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&a…

技术创新与人才培养并重 软通动力子公司鸿湖万联亮相OpenHarmony人才生态大会

11月27日&#xff0c;由开放原子开源基金会指导&#xff0c;OpenHarmony项目群工作委员会主办的OpenHarmony人才生态大会2024在武汉隆重举办。软通动力子公司鸿湖万联作为OpenHarmony项目群A类捐赠人应邀出席。大会期间&#xff0c;鸿湖万联不仅深度参与了OpenHarmony人才生态年…

简单快速的上手python

前言 python是一门可以快速上手的语言&#xff0c;原因是它语法简单&#xff0c;api容易使用自由灵活 当我们需要安装任何的三方库时&#xff0c;只需要执行 pip install XX 之后在代码里面import xxx就可以使用python啦。 并且python的代码自由灵活&#xff0c;使用缩进区…

【算法刷题指南】优先级队列

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

[241129] Docker Desktop 4.36 发布:企业级管理功能、WSL 2 增强 | Smile v4.0.0 发布

目录 Docker Desktop 4.36 发布&#xff1a;企业级管理功能、WSL 2 和 ECI 增强Smile v4.0.0 发布&#xff01;Java 机器学习库迎来重大升级 Docker Desktop 4.36 发布&#xff1a;企业级管理功能、WSL 2 和 ECI 增强 Docker Desktop 4.36 带来了强大的更新&#xff0c;简化了…