说起这道题,我其实是很气的,个人赛最后两个小时我一道题都没做出来,这道题其实很好做,做的时候总怕有什么坑,但其实差不多思路理顺写下来就行了。还是怪自己代码力弱,前面的卡了一下,做的时候就不是很顺,这道题和k题不是很敢下手,但其实都是能做的。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#include<string>
#include<map>
#include<iostream>
using namespace std;
map<string,int> mp;
int main()
{
int t;
mp.clear();
mp["one"] = 1;
mp["two"] = 2;
mp["three"] = 3;
mp["four"] = 4;
mp["five"] = 5;
mp["six"] = 6;
mp["seven"] = 7;
mp["eight"] = 8;
mp["nine"] = 9;
mp["ten"] = 10;
mp["eleven"] = 11;
mp["twelve"] =12;
mp["thirteen"] =13;
mp["fourteen"] =14;
mp["fifteen"] =15;
mp["sixteen"] =16;
mp["seventeen"] =17;
mp["eighteen" ] =18;
mp["nineteen"] = 19;
mp["twenty"] = 20;
mp["thirty"] = 30;
mp["forty"] = 40;
mp["fifty"] = 50;
mp["sixty"] = 60;
mp["seventy"] = 70;
mp["eighty"] = 80;
mp["ninety"] = 90;
scanf("%d",&t);
while(t--)
{
string tmp;
char c =' ';
int ans = 0,x=0;
while(c!='\n')
{
cin>>tmp;
c = getchar();
if(tmp == "million")
{
ans+=x*1000000;
x =0;
}
else if(tmp == "thousand")
{
ans += x*1000;
x =0;
}
else if(tmp == "hundred")
{
x*=100;
}
else if(tmp == "and")
{
continue;
}
else
{
x +=mp[tmp];
//printf("***%d***\n",x);
}
//cout<<tmp<<endl;
}
ans +=x;
printf("%d\n",ans);
}
}
这段代码有几个很妙的处理技巧,1: 输入时候可以不用gets()读取包括空格在内的字符,可以通过巧用getchar()吸收scanf缓冲区的字符来判断输入是否结束,当然有一点很重要char c = ‘ ’,要初始化为一个空格,不然char型默认用0填充,根本进入不了循环。2 : 还有就是巧用map来实现字符的转换。
我承认在字符串处理这块我还是很弱的啊,做的题少,接触的少,很多技巧思路,比赛的时候一时半会想不到;