top1编程
← 返回题目
题解

插入数字1

1 条题解

  • 0
    @ 2026-8-4 1:12:13

    解题思路

    输入一个两位数 x 和一个一位数 y,把 y 插到 x 的十位和个位之间,拼成一个新的三位数。例如 x=27、y=1,结果是 217。

    先想想 217 是怎么来的:原来的 27,十位是 2,个位是 7,把 1 夹在中间,就是“2 1 7”——原来的十位 2 跑到了百位,插进来的 1 在十位,原来的个位 7 留在个位。

    做法分三步(用上数位分离):

    1. 拆出 x 的十位:shi = x / 10(27/10=2);
    2. 拆出 x 的个位:ge = x % 10(27%10=7);
    3. 重新拼成三位数:ans = shi * 100 + y * 10 + ge,也就是 2×100 + 1×10 + 7 = 217。

    为什么乘以 100 和 10?因为在新数字里:原来的十位站到了百位,要乘 100;插进来的 y 站在十位,要乘 10;原来的个位还在个位,乘 1 即可。题目保证 y 是一位数(1 ≤ y < 10),所以 y 乘 10 正好放在十位,不会和别的位撞上。

    可以用逆运算验证:把 217 对 10 取余得到 7(原来的个位),十位取出是 1(插进来的 y),百位是 2(原来的十位),完全还原,说明公式是对的。

    参考代码

    #include <iostream>
    using namespace std;
    
    int main() {
        int x, y;       // x:原来的两位数,y:要插进去的一位数字
        cin >> x >> y;  // 读入两位数x和一位数y
        int shi;        // shi:x的十位
        int ge;         // ge:x的个位
        shi = x / 10;   // 除以10得到十位
        ge = x % 10;    // 对10取余得到个位
        int ans;        // ans:拼成的新三位数
        // 原十位站到百位乘100,y站到十位乘10,原个位留在个位
        ans = shi * 100 + y * 10 + ge;
        cout << ans << endl;   // 输出新三位数
        return 0;
    }
    

    复杂度分析

    程序只做几次整数运算(两次数位分离、一次组合乘加),运算次数固定,与 x、y 的大小无关。所以时间复杂度是 O(1),空间复杂度也是 O(1)(只用了 5 个 int 变量)。

    “数位分离 + 重新拼数”是处理“改变数字排列”问题的通用套路,只要掌握 n/10 和 n%10,类似的题都能解。

    • 1