UVa 486 English-Number Translator

UVa 486 English-Number Translator 题目描述题目要求将英文描述的数字范围−999,999,999-999,999,999−999,999,999到999,999,999999,999,999999,999,999转换为整数。输入每行一个英文数字描述输出对应的整数。输入格式输入包含多行每行一个英文数字描述。数字可以包含以下单词negative、zero、one、two、three、four、five、six、seven、eight、nine、ten、eleven、twelve、thirteen、fourteen、fifteen、sixteen、seventeen、eighteen、nineteen、twenty、thirty、forty、fifty、sixty、seventy、eighty、ninety、hundred、thousand、million。输入以文件结束符EOF\texttt{EOF}EOF终止。输出格式对于每个输入行输出一行对应的整数。样例输入six negative seven hundred twenty nine one million one hundred one输出6 -729 1000101题目分析本题的核心是将英文数字描述解析为整数。解析规则遵循英文数字的读法数字由“百万million\texttt{million}million”、“千thousand\texttt{thousand}thousand”、“百hundred\texttt{hundred}hundred”等单位组成。每个单位之前可以有一个111到999999999的数字表示该单位的数量。单位之间以及单位内部使用“百”和“十/个”位组合。负数以negative开头。递归解析可以使用递归方法解析将输入单词序列按单位million、thousand、hundred分割。若遇到million则million前的部分乘以1,000,0001,000,0001,000,000加上million后的部分。若遇到thousand则thousand前的部分乘以1,0001,0001,000加上thousand后的部分。若遇到hundred则hundred前的数字乘以100100100加上hundred后的部分即十位和个位。若没有这些单位则直接解析一个单词直接查表。两个单词第一个是十位数词如twenty第二个是个位数词如three结果为两者之和。单词映射建立从英文单词到数值的映射表基本数字zero到nineteen对应000到191919。十位数twenty、thirty、…、ninety对应202020、303030、…、909090。单位hundred100100100、thousand100010001000、million100000010000001000000。负数处理若第一个单词为negative则最终结果取相反数。复杂度分析每个单词处理一次时间复杂度O(单词数)O(\text{单词数})O(单词数)。代码实现// English-Number Translator// UVa ID: 486// Verdict: Accepted// Submission Date: 2016-07-17// UVa Run Time: 0.000s//// 版权所有C2016邱秋。metaphysis # yeah dot net#includebits/stdc.husingnamespacestd;mapstring,intvalue{{zero,0},{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},{thirty,30},{forty,40},{fifty,50},{sixty,60},{seventy,70},{eighty,80},{ninety,90},{hundred,100},{thousand,1000},{million,1000000}};intstringToInt(vectorstringnumber){if(number.size()0)return0;if(number.size()1)returnvalue[number.front()];intsign1;if(number.front()negative){number.erase(number.begin());sign-1;}vectorstringtag{million,thousand,hundred};intsum0;boolfoundfalse;for(inti0;i3;i){autoindexfind(number.begin(),number.end(),tag[i]);if(index!number.end()){vectorstringnext(number.begin(),index);sumstringToInt(next)*value[tag[i]];number.erase(number.begin(),index1);sumstringToInt(number);foundtrue;break;}}if(foundfalse){if(number.size()1)sumvalue[number.front()];if(number.size()2)sumvalue[number.front()]value[number.back()];}returnsign*sum;}intmain(intargc,char*argv[]){cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);string line,digit;istringstream iss;while(getline(cin,line)){vectorstringnumber;iss.clear();iss.str(line);while(issdigit)number.push_back(digit);coutstringToInt(number)\n;}return0;}