using namespace std;
string s,nm[10];
map<string,int>word={
{"zero",-1},{"one",1},{"two",2},{"three",3},{"four",4},{"five",5},
{"six",6},{"seven",7},{"eight",8},{"nine",9},{"ten",10},
{"eleven",11},{"twelve",12},{"thirteen",13},{"fourteen",14},{"fifteen",15},
{"sixteen",16},{"seventeen",17},{"eighteen",18},{"nineteen",19},{"twenty",20},
{"a",1},{"both",2},{"another",1},{"first",1},{"second",2},{"third",3}
};
int m[10],_m;
void T(int num,int p){
	string s1="",s2="";
	while(num!=0){
		s1+=num%10+'0';
		num/=10;
	}
	for(int i=s1.size()-1;i>=0;i--){
		s2+=s1[i];
	}
	nm[p]+=s2;
}
int main(){
	getline(cin,s);
	int _s=s.size();
	for(int i=0;i<_s&&s[i]!='.';i++){
		if(s[i]!=' '){
			string x="";
			for(;s[i]!=' '&&s[i]!='.'&&i<_s;i++){
				x+=s[i];
			}
			if(word[x]!=0){
				if(word[x]==-1) m[++_m]=0;
				else m[++_m]=word[x];
			}
		}
	}
	if(_m==0){
		cout<<"0";
		return 0;
	}
	for(int i=1;i<=_m;i++){
		m[i]=m[i]*m[i]%100;
	}
	sort(m+1,m+_m+1);
	for(int i=1;i<=_m;i++){
		if(m[i]==0) nm[i]+="00";
		if(m[i]<10&&m[i]>0) nm[i]+='0';
		T(m[i],i);
	}
	for(int i=1,k=0;i<=_m;i++){
		for(;nm[i].size()>=1;){
			if(nm[i][0]=='0') nm[i].erase(0,1);
			else{
				k=1;
				break;
			}
		}
		if(k==1) break;
	}
	if(nm[_m]==""){
		cout<<"0";
		return 0;
	}
	for(int i=1;i<=_m;i++){
		cout<<nm[i];
	}
	return 0;
}

1 comments

  • @ 2026-9-4 20:29:24

    李泽瑞同学,你好。

    我看到了你的代码,整体思路是清晰的:先将英文单词映射为数字,然后平方取模,再排序,最后拼接输出。这说明你对题目的基本流程掌握得不错。

    不过,代码中暴露出几个比较典型的逻辑漏洞。作为教练,我不会直接给你“正确代码”,但我们可以一起分析一下这些“坑”在哪里。

    核心考点分析: 这道题的真正陷阱在于**“0”的处理“前导零”的消除**,以及排序后拼接的细节

    请你先思考以下几个问题:

    1. 关于“zero”的处理:你在 word 映射中将 "zero" 设为 -1。为什么不用 0?你在代码中用了 if(word[x]!=0) 来判断单词是否存在。请思考:如果单词是 "zero"word[x] 的值是多少?这个判断条件会漏掉哪些单词?如果漏掉了,程序会怎么走?

    2. 关于排序的时机:你的排序是在平方取模之后进行的。请问,题目要求的是对“平方后的数”排序,还是对“原始数字”排序?如果题目要求先排序再平方,你的顺序就对了吗?(请再读一遍原题确认)。

    3. 关于拼接时的前导零

      • 你在 m[i] 小于 10 时补了一个 '0',这是为了确保两位输出(比如 2 输出 02)。但之后你又用了一个非常复杂的循环去删除 nm[i] 开头的 0。这里存在一个矛盾:你既想保留两位(补零),又想删除开头零(去零)。请想一想,最终输出的格式到底应该是怎样的?题目要求是“去掉前导零”,但如果是 0 本身呢?如果是 00 呢?
      • 你的删除循环逻辑很混乱:k 变量的作用是什么?如果第一个数字是 0,你删除了它,但第二个数字如果是 10,你输出的是 10 还是 010?你的逻辑能正确处理“中间有零”的情况吗?
    4. 关于边界情况

      • 如果输入是 "one two three.",你的程序输出结果是什么?手算一下,看看是否符合逻辑。
      • 如果输入是 "zero.",你的 _m 会变成 1 吗?m[1] 的值是多少?最终输出是什么?

    建议的调试方法: 不要只看代码逻辑,请自己构造几组特殊数据(比如包含 zero、包含 one、只包含 zero、包含多个数字且排序后有前导零的情况),用你的程序跑一遍,观察输出是否符合题目要求。

    提示: 这道题最简洁的做法,往往是把每个数的平方结果(两位数字)当作字符串存起来,最后统一拼接时,再考虑如何优雅地处理“第一个非零数”之前的所有零(包括那些因补零产生的零)。

    请先回答上述问题,并尝试自己找出代码中的逻辑矛盾。如果你能指出问题所在,我们再来讨论如何修正。你的代码思路是对的,但细节决定成败。

    • 1