题解:洛谷 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

【核心思想】

  1. 问题分析:给定 \(n\) 个整数,将每个整数四舍五入到最接近的整十数。这是一个数位分解与条件判断问题,核心在于提取个位数并依据其大小决定舍入方向。

  2. 算法选择

    • 数位分解:通过取模和整除运算分离出个位数和十位数以上部分
    • 条件判断:根据个位数与 \(5\) 的大小关系确定舍入结果
  3. 关键步骤

    • 读入数据:读取 \(n\)
    • 逐数处理\(i\)\(1\)\(n\)):
      • 读入 \(x\)
      • \(gw \leftarrow x \bmod 10\)(个位数)
      • \(sw \leftarrow x / 10\)(十位数及以上部分)
      • \(gw < 5\):输出 \(sw \times 10\)(舍去)
      • 否则:输出 \((sw + 1) \times 10\)(进一)
    • 输出结果
  4. 时间/空间复杂度

    • 时间复杂度:\(O(n)\),每个数处理为 \(O(1)\)
    • 空间复杂度:\(O(1)\),仅使用常数额外空间
  5. 数位分解与舍入规则的核心思想

    • 个位数的决定性作用:四舍五入到整十数时,只需关注个位数:\(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
posted @ 2026-07-16 16:16  团爸讲算法  阅读(16)  评论(0)    收藏  举报