代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB
题目描述
给你一个或多个表示整数的英文单词,你的任务就是把这些英文单词表示的整数翻译成数字形式。数字的范围是从-999999999到+999999999。以下是可能出现的英文单词:
negative,zero,one,two,three,four,five,six,seven,eight,nini,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty, sixty,seventy,eighty,ninety,hundred,thousand,millon
输入格式
输入包含多组测试数据。需要注意以下输入,负数前面用negative单词;当能用thousand表示时,就不用hundred来表示。例如,1500表示成one thousand five hundred,而不是fifteen hundred。
输出格式
输出翻译后的整数,占一行。
输入样例
six
negative seven hundred twenty nine
one million one hundred one
eight hundred fourteen thousand twenty two
输出样例
6
-729
1000101
814022
个人思路
- 用map(string,int)来对应存各自字符串代表的英文,然后直接调用输出会很方便。可以用一个字符串存入所有的,然后按顺序分割并对应数字存入,这里用了比较傻瓜式的复制粘贴一个一个码的。
- 对不同的数字区分的点是按题意会出现几千几百几十几百万,和几百几十几千。所以如果只用一个中间值(flag),则对百万和千的情况可直接累加到最终结果,几百几千则给一个中间值方便后面出现百万或千时直接用中间值乘。几十或各位数的情况类加给中间值就可以解决整个逻辑输出问题。
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<string,int> num;
num["negative"]=-1;
num["zero"]=0;
num["one"]=1;
num["two"]=2;
num["three"]=3;
num["four"]=4;
num["five"]=5;
num["six"]=6;
num["seven"]=7;
num["eight"]=8;
num["nine"]=9;
num["ten"]=10;
num["eleven"]=11;
num["twelve"]=12;
num["thirteen"]=13;
num["fourteen"]=14;
num["fifteen"]=15;
num["sixteen"]=16;
num["seventeen"]=17;
num["eighteen"]=18;
num["nineteen"]=19;
num["twenty"]=20;
num["thirty"]=30;
num["forty"]=40;
num["fifty"]=50;
num["sixty"]=60;
num["seventy"]=70;
num["eighty"]=80;
num["ninety"]=90;
num["hundred"]=100;
num["thousand"]=1000;
num["million"]=1000000;
bool b=true;
string str;
while(getline(cin,str))
{
if(!b)
cout<<endl;
b=false;
str+=" ";
int neg=1;
string temp="";
long long int ans=0;
long long int flag=0;
for(int i=0;i<str.length();i++)
{
if(str[i]!=' ')
{
temp+=str[i];
}
else
{
if(num[temp]==-1)
{
neg=-1;
}
else if(num[temp]==1000000)
{
ans+=(num[temp]*flag);
flag=0;
}
else if(num[temp]==1000)
{
ans+=(flag*num[temp]);
flag=0;
}
else if(num[temp]==100||num[temp]==10)
{
flag=(flag*num[temp]);
}
else
{
flag+=num[temp];
}
temp="";
}
}
ans+=flag;
ans*=neg;
cout<<ans;
}
}