题解:洛谷 B4496 数字替换
【题目来源】
洛谷:B4496 [GESP202603 一级] 数字替换 - 洛谷
【题目描述】
Alice 不喜欢数字 \(4\),但觉得数字 \(8\) 寓意好,她想把数中的 \(4\) 全都替换成 \(8\),若数中不含 \(4\) 则无需修改,你能帮帮她吗?
【输入】
输入一行,包含一个整数 \(A\),表示替换前的数。
【输出】
输出一行,包含一个整数 \(B\),表示替换后的数。
【输入样例】
8459045
【输出样例】
8859085
【核心思想】
-
问题分析:给定一个整数 \(A\),需要将其十进制表示中所有数字
4替换为8,其余数字保持不变。由于替换操作按位独立进行,不涉及进位或数值计算,因此将整数视为字符串逐字符处理是最直接的方案。 -
算法选择:
- 字符串逐位替换:将整数读入字符串,遍历每个字符,遇到
4则替换为8
- 字符串逐位替换:将整数读入字符串,遍历每个字符,遇到
-
关键步骤:
- 读取输入:将整数 \(A\) 以字符串形式读入 \(S\)
- 遍历替换:对 \(S\) 的每个字符 \(S_i\):
- 若 \(S_i = \texttt{`4'}\),则 \(S_i \leftarrow \texttt{`8'}\)
- 输出结果:输出替换后的字符串 \(S\)
-
时间/空间复杂度:
- 时间复杂度:\(O(|S|)\),即数字的位数,遍历一次完成所有替换
- 空间复杂度:\(O(|S|)\),存储输入字符串
-
字符串逐位替换的核心思想:
- 数位独立性:每个数字位的替换互不影响,无需考虑数值大小关系或进位,因此字符串处理比数值运算更直接
- 字符等价性:数字的字符表示(
'0'~'9')与其数值一一对应,替换操作在字符层面即可完成,无需转换为整数 - 输入输出一致性:以字符串形式读取和输出,避免了整数类型可能导致的位数限制问题(如超长数字),同时简化了逐位访问
- 单遍历完成:每个字符最多被检查一次、修改一次,无回溯需求,是最优的线性时间处理
- 适用于数位级别的条件替换、数字变形、字符过滤等基础字符串处理问题
【算法标签】
入门 #语法基础
【代码详解】
#include <bits/stdc++.h> // 包含所有标准库头文件
using namespace std; // 使用标准命名空间
string a; // 定义一个字符串变量a,用于存储输入
int main() // 主函数入口
{
cin >> a; // 从标准输入读取一个字符串到变量a中
// 遍历字符串a的每个字符
for (int i = 0; i < a.size(); i++)
{
// 如果当前字符是'4'
if (a[i] == '4')
{
a[i] = '8'; // 将'4'替换为'8'
}
}
cout << a << endl; // 输出替换后的字符串
return 0; // 程序正常结束
}
【运行结果】
8459045
8859085
浙公网安备 33010602011771号