C++ 实现统计 n 个小数四舍五入结果与向上/向下取整相等的个数
好的,我们来详细分析并解决这个问题。 ## 🧠 问题解析 题目要求对 `n` 个小数分别进行 **四舍五入**、**向上取整** 和 **向下取整**,然后统计 **四舍五入结果** 分别等于 **向上取整结果** 的次数,以及等于 **向下取整结果** 的次数。 ### 📌 关键概念说明 - **向下取整 (floor)**:取不超过该数的最大整数。例如 `floor(1.1) = 1`,`floor(3.7) = 3`。 - **向上取整 (ceil)**:取不小于该数的最小整数。例如 `ceil(1.1) = 2`,`ceil(3.7) = 4`。 - **四舍五入 (round)**:小数部分 ≥ 0.5 则进一,否则舍去。例如 `round(1.1) = 1`,`round(3.7) = 4`。 **核心判断逻辑:** - 如果 `round(x) == ceil(x)`,则 count_ceil_equals 加 1。 - 如果 `round(x) == floor(x)`,则 count_floor_equals 加 1。 ### ⚙️ 数学简化 对于一个正小数(题目未明确说明负小数,通常输入是正数,但为了严谨,也处理负数): - 当小数部分 **< 0.5** 时:`round(x) = floor(x)` - 当小数部分 **≥ 0.5** 时:`round(x) = ceil(x)` - 注意:当小数部分 **恰好等于 0**(整数)时,`floor(x) = ceil(x) = round(x) = x`,此时两个计数都会增加。 --- ## 💻 C++ 实现代码 ```cpp #include <iostream> #include <cmath> using namespace std; int main() { int n; cin >> n; // 输入数字个数 int count_floor_equal = 0; // 四舍五入 == 向下取整 的次数 int count_ceil_equal = 0; // 四舍五入 == 向上取整 的次数 for (int i = 0; i < n; ++i) { double x; cin >> x; // 计算三种取整结果 double floor_val = floor(x); double ceil_val = ceil(x); double round_val = round(x); // C++11 及以上支持 round 函数 if (round_val == floor_val) { count_floor_equal++; } if (round_val == ceil_val) { count_ceil_equal++; } } // 输出:先输出与向上取整相等的个数,再输出与向下取整相等的个数 cout << count_ceil_equal << " " << count_floor_equal << endl; return 0; } ``` --- ## 🔍 样例验证 输入: ``` 3 1.1 2.1 3.7 ``` - 1.1:`floor=1`, `ceil=2`, `round=1` → round == floor ✅ - 2.1:`floor=2`, `ceil=3`, `round=2` → round == floor ✅ - 3.7:`floor=3`, `ceil=4`, `round=4` → round == ceil ✅ 输出: ``` 1 2 ``` 与题目示例完全一致 ✅ --- ## ⚠️ 注意事项与陷阱 1. **精度问题**:浮点数在计算机中存储可能不精确,但本题使用标准库 `round`, `floor`, `ceil` 对 `double` 直接比较通常没问题。如果担心,可以加一个极小误差(如 `1e-9`)来避免边界情况,但一般情况下不需要。 2. **整数情况**:当输入恰好为整数(如 `5.0`)时,三种取整结果都是 `5`,因此两个计数器都会增加。这是符合逻辑的。 3. **负数情况**:如果输入包含负数(如 -1.3),`floor(-1.3) = -2`,`ceil(-1.3) = -1`,`round(-1.3) = -1`。此时与向上取整相等。但根据一般题目描述“n个小数”,常常默认为正数。如有需要,代码同样适用。 4. **C++ 版本**:`round` 函数是 C++11 标准引入的,请确保编译器开启 C++11 或更高版本。编译时可加参数:`g++ -std=c++11 file.cpp -o file` --- ## 🛠️ 编译与运行 ```bash # 编译 g++ -std=c++11 -o rounding rounding.cpp # 运行 ./rounding # 输入样例 3 1.1 2.1 3.7 # 输出 1 2 ``` --- ## 📖 - 本问题核心是理解 floor、ceil、round 的区别。 - 实现上只需逐个数判断 round 结果与 floor/ceil 的相等关系。 - **输入输出格式**:注意输出先写“与向上取整相等个数”,再写“与向下取整相等个数”。 ### 💡 开发建议 - 多测试边界:如 `x=0.0`, `x=0.5`, `x=1.4999999` 等。 - 在 C++ 中,如果不确定 `round` 的行为(特别是负数),建议查阅 cppreference。 - 若题目数据量极大(超过 10^6),可考虑用 scanf/printf 提高 IO 效率,但本题数据规模不明显,cin/cout 足以。 --- ######[AI写代码神器 | 1297点数解答 | 2026-05-09 19:44:43]
- Java 实现:从点类到圆类,计算圆心坐标(50,30)、半径 4 的圆周长与面积(字节豆包 | 246点数解答 | 2024-11-11 16:36:30)359
- 星际编码大赛终极对决:机械星AI与异星人激战“逆序对”统计难题(字节豆包 | 509点数解答 | 2025-04-19 17:33:00)299
- C++ 实现:根据给定正整数构造 3×3 方阵并计算满足条件的方案数(阿里通义 | 875点数解答 | 2024-11-13 16:38:24)267
- C++实现:低复杂度求解 3×3 方阵构造方案数(阿里通义 | 708点数解答 | 2024-11-13 16:45:15)302
- Python 实现球类:精准计算半径、表面积与体积,附输入验证与异常处理!(阿里通义 | 261点数解答 | 2024-11-28 21:19:39)384
- Python:轻松提取10.0到99.0小数的整数部分(字节豆包 | 136点数解答 | 2026-01-11 19:23:18)58
- 51 单片机:定时器 0 实现 8 个 LED 循环点亮,附代码及优化建议(字节豆包 | 1193点数解答 | 2024-12-27 15:10:29)354
- 帮胖虎小夫70周年友谊派对分派,精准计算两种输出方案!(阿里通义 | 672点数解答 | 2024-10-20 21:46:18)213
- C++ 助力胖虎小夫 70 周年派对派分难题!精准输出派的分配大小(阿里通义 | 523点数解答 | 2024-10-20 21:46:33)181
- C++ 助力胖虎小夫 70 周年友谊派对:精准分派难题迎刃而解!(阿里通义 | 570点数解答 | 2024-10-20 21:47:23)221
- C++ 实现小数四舍五入:含代码及进位处理注意点(字节豆包 | 598点数解答 | 2025-07-05 15:32:23)271
- C++实现图像模糊化处理:含代码、解释与复杂度分析(字节豆包 | 670点数解答 | 2025-11-10 18:55:33)134