我们需要将给定整数 A 中所有出现的数字 4 替换为 8,其余数字保持不变。如果整数中不包含数字 4,则原样输出。
数据范围:0≤A≤108,最大只有 9 位数,完全可以用简单的循环逐位处理。
这是一个典型的按位处理问题。我们可以取出原数的每一位数字:
4,则替换为 8;然后将处理后的数字重新组合成最终的整数。
b = 0,以及一个权值变量 t = 1(代表当前位的 10 的幂次:个位、十位、百位……)。a 不为 0,执行以下操作:
digit = a % 10;digit == 4,则在新数对应位加上 8 * t;digit * t;a 除以 10(去掉最低位),t 乘以 10(跳到更高一位)。b 就是替换后的结果。特别处理 A = 0:
0 中不含数字 4,按照题意应输出 0。上述循环在 a = 0 时不会执行,输出初始值 b = 0,结果正确。
我们使用取模与整除来逐位分离数字,这是处理整数数位的常用技巧。
例如 a = 8459045:
| 轮次 | a 的值 | a % 10 | 当前位处理 | b 的变化 | t 的值 |
|---|---|---|---|---|---|
| 1 | 8459045 | 5 | 5 ≠ 4 → 加 5×1 | b = 5 | 10 |
| 2 | 845904 | 4 | 4 == 4 → 加 8×10 | b = 85 | 100 |
| 3 | 84590 | 0 | 0 ≠ 4 → 加 0×100 | b = 85 | 1000 |
| 4 | 8459 | 9 | 9 ≠ 4 → 加 9×1000 | b = 9085 | 10000 |
| 5 | 845 | 5 | 5 ≠ 4 → 加 5×10000 | b = 59085 | 100000 |
| 6 | 84 | 4 | 4 == 4 → 加 8×100000 | b = 859085 | 1000000 |
| 7 | 8 | 8 | 8 ≠ 4 → 加 8×1000000 | b = 8859085 | 10000000 |
| 8 | 0 | 结束 | 最终结果 8859085 |
设整数 A 的位数为 d,则 d≈log10A≤9。
循环执行 d 次,每次只做常数次取模、比较、乘法和加法运算。
因此时间复杂度为 O(log10A),在本题数据范围下完全可以忽略不计,空间复杂度为 O(1)。
cpp1#include <iostream> 2using namespace std; 3 4int main() { 5 int a, b = 0, t = 1; 6 cin >> a; // 读入原始数字 7 while (a) { // 当 a 不为 0 时逐位处理 8 if (a % 10 == 4) // 如果当前最低位是 4 9 b += t * 8; // 替换为 8 并乘以对应位权 10 else 11 b += t * (a % 10); // 否则保留原数字 12 a /= 10; // 去掉已经处理的最低位 13 t *= 10; // 位权向左移动一位(×10) 14 } 15 cout << b; // 输出替换后的结果 16 return 0; 17}
代码说明:
a % 10 获取当前最低位的数字;t 记录当前位的实际数值(个位为1,十位为10,百位为100……);b 上后,a 右移一位(a /= 10),t 左移一位(t *= 10);b。本题主要考察数位分离的基本功。通过 %10 和 /10 的组合可以轻松逐位读取整数,再根据规则重新组合即可。注意特殊值 0 的处理,本代码利用循环前置条件自然地解决了这一问题。