- 高 2029 届信息学竞赛选拔考试
密码
- @ 2026-9-4 20:29:15
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
-
Myobot @ 2026-9-4 20:29:24
李泽瑞同学,你好。
我看到了你的代码,整体思路是清晰的:先将英文单词映射为数字,然后平方取模,再排序,最后拼接输出。这说明你对题目的基本流程掌握得不错。
不过,代码中暴露出几个比较典型的逻辑漏洞。作为教练,我不会直接给你“正确代码”,但我们可以一起分析一下这些“坑”在哪里。
核心考点分析: 这道题的真正陷阱在于**“0”的处理和“前导零”的消除**,以及排序后拼接的细节。
请你先思考以下几个问题:
-
关于“zero”的处理:你在
word映射中将"zero"设为-1。为什么不用0?你在代码中用了if(word[x]!=0)来判断单词是否存在。请思考:如果单词是"zero",word[x]的值是多少?这个判断条件会漏掉哪些单词?如果漏掉了,程序会怎么走? -
关于排序的时机:你的排序是在平方取模之后进行的。请问,题目要求的是对“平方后的数”排序,还是对“原始数字”排序?如果题目要求先排序再平方,你的顺序就对了吗?(请再读一遍原题确认)。
-
关于拼接时的前导零:
- 你在
m[i]小于 10 时补了一个'0',这是为了确保两位输出(比如 2 输出 02)。但之后你又用了一个非常复杂的循环去删除nm[i]开头的0。这里存在一个矛盾:你既想保留两位(补零),又想删除开头零(去零)。请想一想,最终输出的格式到底应该是怎样的?题目要求是“去掉前导零”,但如果是0本身呢?如果是00呢? - 你的删除循环逻辑很混乱:
k变量的作用是什么?如果第一个数字是0,你删除了它,但第二个数字如果是10,你输出的是10还是010?你的逻辑能正确处理“中间有零”的情况吗?
- 你在
-
关于边界情况:
- 如果输入是
"one two three.",你的程序输出结果是什么?手算一下,看看是否符合逻辑。 - 如果输入是
"zero.",你的_m会变成 1 吗?m[1]的值是多少?最终输出是什么?
- 如果输入是
建议的调试方法: 不要只看代码逻辑,请自己构造几组特殊数据(比如包含
zero、包含one、只包含zero、包含多个数字且排序后有前导零的情况),用你的程序跑一遍,观察输出是否符合题目要求。提示: 这道题最简洁的做法,往往是把每个数的平方结果(两位数字)当作字符串存起来,最后统一拼接时,再考虑如何优雅地处理“第一个非零数”之前的所有零(包括那些因补零产生的零)。
请先回答上述问题,并尝试自己找出代码中的逻辑矛盾。如果你能指出问题所在,我们再来讨论如何修正。你的代码思路是对的,但细节决定成败。
-
- 1