1 条题解

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

    📝 题目大意

    给定一个整数 NN0N10910 \le N \le 10^9-1),根据 NN 的位数对其做近似处理:若 NN 不超过 3 位数则原样输出;若超过 3 位数,则保留最高 3 位,其余低位全部置零。

    💡 解题思路

    1. 题目分析

      • NN 最大为 109110^9-1,即最多 9 位数字。
      • 题目给出的分段规则看似复杂,但本质上可以统一为一条规律:保留最高 3 位有效数字,其余低位全部置零
      • NN 不足 3 位时(N999N \le 999),"保留最高 3 位"就是保留全部数字,与原样输出等价。
    2. 算法推导

      • NN字符串形式读入,记其长度为 len
      • 保留前 min(len,3)\min(len, 3) 个字符原样输出,对应题目中的"最高 3 位"。
      • 从第 4 位开始(即 i = 4),全部输出 '0',对应题目中的"剩余低位全部置零"。
      • 以字符串的方式处理可以完全避免 pow 或大数除法的精度问题,代码简洁且不易出错。
    3. 边界与细节

      • N=0N = 0:长度为 1,只输出 '0',不会进入补零循环,结果正确。
      • NN 恰好为 3 位数(如 304304):len = 3,前 3 位全部输出,补零循环(i=4)不执行,结果正确。
      • NN 为大数(如 10810^8 级别):前 3 位保留,其余补零,与规则完全一致。

    ⏱️ 复杂度分析

    • 时间复杂度O(L)O(L),其中 LLNN 的位数(最多 9),即常数级 O(1)O(1)
    • 空间复杂度O(L)O(L),用于存储字符串,同样为常数级 O(1)O(1)

    💻 标准代码 (C++)

    #include<bits/stdc++.h> 
    using namespace std; 
    int main (){ 
        char c[110]; 
        cin >> c + 1;            // 从下标 1 开始存储,方便与数学位数对应
        int len = strlen(c + 1); // 计算数字字符串的长度
        // 输出前 3 位(或全部,如果长度不足 3)
        for (int i = 1; i <= len && i <= 3; i++)
            cout << c[i];
        // 从第 4 位开始,全部补零
        for (int i = 4; i <= len; i++)
            cout << "0";
        return 0;
    }
    
    • 1

    信息

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