1 条题解

  • 0
    @ 2026-6-19 10:30:49

    📝 题目大意

    给定一个整数 XX1018X1018-10^{18} \leq X \leq 10^{18}),求 X10\left\lceil\dfrac{X}{10}\right\rceil,即大于等于 X10\frac{X}{10} 的最小整数。

    💡 解题思路

    1. 题目分析:本题本质是求整数除以 10 的向上取整结果。C++ 的整数除法 / 默认向零取整(truncate toward zero),不能直接得到向上取整,因此需要分正负讨论。

    2. 算法推导

      • X0X \geq 0:使用经典的向上取整技巧 (x + 9) / 10。其原理是:若 XX 能被 10 整除,则加 9 不会跨越下一个 10 的倍数,整除结果不变;若 XX 不能被 10 整除,加 9 后恰好跨入下一个整数,实现 X/10\lceil X/10 \rceil 的效果。
      • X<0X < 0:C++ 中整数除法向零取整的特性恰好天然满足向上取整。例如 13/10=1-13 / 10 = -1(C++ 行为),而 1.3=1\lceil -1.3 \rceil = -1,两者一致。因此负数直接使用 x / 10 即可。
    3. 边界与细节

      • X=0X = 0(0 + 9) / 10 = 00=0\lceil 0 \rceil = 0,正确。
      • XX 为 10 的倍数:如 X=40X = 40(40 + 9) / 10 = 4X=20X = -20,`-20 / 10 = -2$,均正确。
      • 数据范围可达 101810^{18},必须使用 long long(64 位有符号整数),int 会溢出。

    ⏱️ 复杂度分析

    • 时间复杂度:仅常数次运算,O(1)O(1)
    • 空间复杂度:仅使用两个 long long 变量,O(1)O(1)

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        long long x,ans;          // 使用 long long 防止溢出,X 范围可达 ±10^18
        cin>>x;
        if(x>=0)ans=(x+9)/10;     // 正数:向上取整技巧 (x+9)/10
        else ans=x/10;            // 负数:C++ 向零取整天然等于向上取整
        cout<<ans;
        return 0;
    }
    
    • 1

    信息

    ID
    779
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者