题解:洛谷 B4258 四舍五入
【题目来源】
洛谷:B4258 [GESP202503 一级] 四舍五入 - 洛谷(luogu.com.cn)
【题目描述】
四舍五入是一种常见的近似计算方法。现在,给定 \(n\) 个整数,你需要将每个整数四舍五入到最接近的整十数。例如,\(43\) 四舍五入后为 \(40\),\(58\) 四舍五入后为 \(60\)。
【输入】
共 \(n+1\) 行,第一行,一个整数 \(n\),表示接下来输入的整数个数。
接下来 \(n\) 行,每行一个整数 \(a_1,⋯,a_n\),表示需要四舍五入的整数。
【输出】
\(n\) 行,每行一个整数,表示每个整数四舍五入后的结果。
【输入样例】
5
43
58
25
67
90
【输出样例】
40
60
30
70
90
【核心思想】
-
问题分析:给定 \(n\) 个整数,将每个整数四舍五入到最接近的整十数。这是一个数位分解与条件判断问题,核心在于提取个位数并依据其大小决定舍入方向。
-
算法选择:
- 数位分解:通过取模和整除运算分离出个位数和十位数以上部分
- 条件判断:根据个位数与 \(5\) 的大小关系确定舍入结果
-
关键步骤:
- 读入数据:读取 \(n\)
- 逐数处理(\(i\) 从 \(1\) 到 \(n\)):
- 读入 \(x\)
- \(gw \leftarrow x \bmod 10\)(个位数)
- \(sw \leftarrow x / 10\)(十位数及以上部分)
- 若 \(gw < 5\):输出 \(sw \times 10\)(舍去)
- 否则:输出 \((sw + 1) \times 10\)(进一)
- 输出结果
-
时间/空间复杂度:
- 时间复杂度:\(O(n)\),每个数处理为 \(O(1)\)
- 空间复杂度:\(O(1)\),仅使用常数额外空间
-
数位分解与舍入规则的核心思想:
- 个位数的决定性作用:四舍五入到整十数时,只需关注个位数:\(0\)-\(4\) 舍去(向下取整到最近的 \(10\)),\(5\)-\(9\) 进一(向上取整到最近的 \(10\))
- 整数运算的精确性:利用整数除法的截断特性,\(x / 10\) 自动丢弃个位,\(x \bmod 10\) 精确提取个位,避免浮点运算的精度问题
- 负数处理的隐含假设:题目未提及负数,代码基于正整数设计。若需处理负数,应使用绝对值判断后再恢复符号
- 适用于数位分离、基于阈值的分类处理类基础问题
【算法标签】
入门 #语法基础
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int n; // 定义变量n,表示输入的整数个数
int main() {
cin >> n; // 输入整数个数n
// 遍历输入的n个整数
for (int i = 1; i <= n; i++) {
int x;
cin >> x; // 输入当前整数x
int gw = x % 10; // 计算x的个位数
int sw = x / 10; // 计算x的十位数
if (gw < 5) { // 如果个位数小于5
cout << sw * 10 << endl; // 输出十位数乘以10
} else { // 如果个位数大于等于5
cout << (sw + 1) * 10 << endl; // 输出十位数加1后乘以10
}
}
return 0;
}
【运行结果】
5
43
40
58
60
25
30
67
70
90
90
浙公网安备 33010602011771号