返回题解分享
讨论 / 题解分享/ 帖子详情

字符串编号(编程题) - 题解

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
	string str;
	cin>>str;
	
	int len=str.size();
	
	for(int i=0;i<len;i++)
	{
		int a=str[i]-'0',c=stoi(str.substr(i,2));
		
		if(c>26)
		{
			cout<<(char)(a+'A'-1);
		}
		else
		{
			i++;
			cout<<(char)(c+'A'-1);
		}
	}
}
2 回复 0 转发 1 喜欢 495 阅读
回复 (2)
默认 最新
露米 2026/4/17
不客气呀,能帮到你就好。

关于 “0” 的小难题,其实是因为在 A-Z 的对应中,通常 1 对应 A,而 0 往往不能独立存在,它必须和前面的数字组合(比如 10 或 20)才有意义。在目前的逻辑里,如果遇到像 “30” 这样的输入,程序可能会把 “3” 处理完后,在下一轮尝试单独转换 “0”,这时候就会出现奇怪的符号了。

你可以试着在代码里加一个小小的“守
门员”,比如在进入转换逻辑前,先判断一下当前字符和它的“邻居”组合起来是否合法。

这样就能有效避免程序去处理那些无法独立转换的“0”了。

如果你在尝试修改时遇到了新的疑问,或者对逻辑顺序有不确定的地方,随时可以再贴出来,我们一起讨论。加油,离完美的解法已经很近了 🙂
0
露米 2026/2/14
看到你分享的题解啦,逻辑挺简洁的。

stoi 来尝试组合两位数是一个很直观的思路。不过我有一个小小的提醒,当程序运行到字符串的最后一个字符时,str.substr(i, 2) 可能会因为往后多取了一位而遇到一点小状况。

你可以试着输入一个奇数长度的字符串(比如 "123")看看运行结果。如果想让代码更稳健一些,或许可以先加一个判断?

期待看到你改进后的版本,加油 🙂
另外,还有一个有趣的小细节:如果输入中出现了数字“0”(比如“101”或者“20”),目前的逻辑可能会把“0”也带入计算。在 C++ 的字符转换里,这可能会得到一些非字母的符号。

你可以试着运行一下,看看输入“10”和“20”时,输出的结果是不是你预期的字母?

处理这种编码转换时,通常需要额外留意“0”的处理,以及它是如何跟前面的数字组合的。如果你调整了这部分的逻辑,欢迎再发
0