题解
插入数字1
1 条题解
-
0
解题思路
输入一个两位数
x和一个一位数y,把y插到x的十位和个位之间,拼成一个新的三位数。例如 x=27、y=1,结果是 217。先想想 217 是怎么来的:原来的 27,十位是 2,个位是 7,把 1 夹在中间,就是“2 1 7”——原来的十位 2 跑到了百位,插进来的 1 在十位,原来的个位 7 留在个位。
做法分三步(用上数位分离):
- 拆出 x 的十位:
shi = x / 10(27/10=2); - 拆出 x 的个位:
ge = x % 10(27%10=7); - 重新拼成三位数:
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,类似的题都能解。 - 拆出 x 的十位:
- 1