举个例子,
nine hundred and eighty seven million six hundred and fifty four thousand three hundred and twelve,它究竟是多少呢?
有兴趣的人自己还可以把它扩展一下吧,比如说加入billion(那就不能用int类型表示了哦),加入point,等等
这种东西简直不是给人看的,所以呢,咱们想一个算法来翻译它吧。
首先分析一下上面那个数字——嗯,断句先——
nine hundred and eighty seven million
|
six hundred and fifty four thousand
|
three hundred and twelve
好了,这下我们算是看懂了——它是
987,654,312
。
再看一个例子:
one hundred million | thirty seven
再看一个例子:
one hundred | and two
你发现了什么吗?
好吧,hundred,thousand,million是用来乘的,而其他的是用来加的,对不对?
OK,指点到此结束,送段代码给大家玩玩:
- #include<iostream>
- #include<sstream>
- #include<map>
- #include<string>
- #include<deque>
- using namespace std;
- map<string,int> msi;
- void init(){
- msi["zero"]=0;
- msi["one"]=1;
- msi["two"]=2;
- msi["three"]=3;
- msi["four"]=4;
- msi["five"]=5;
- msi["six"]=6;
- msi["seven"]=7;
- msi["eight"]=8;
- msi["nine"]=9;
- msi["ten"]=10;
- msi["eleven"]=11;
- msi["twelve"]=12;
- msi["thirteen"]=13;
- msi["fourteen"]=14;
- msi["fifteen"]=15;
- msi["sixteen"]=16;
- msi["seventeen"]=17;
- msi["eighteen"]=18;
- msi["nineteen"]=19;
- msi["twenty"]=20;
- msi["thirty"]=30;
- msi["forty"]=40;
- msi["fifty"]=50;
- msi["sixty"]=60;
- msi["seventy"]=70;
- msi["eighty"]=80;
- msi["ninety"]=90;
- msi["hundred"]=100;
- msi["thousand"]=1000;
- msi["million"]=1000000;
- };
- struct _NOTHING_ {_NOTHING_(){init();}} REALLY_NOTHING;
- int translate(const string& str){
- istringstream ssin(str);
- string tmp;
- deque<string> tokens;
- while(ssin>>tmp){
- tokens.push_front(tmp);
- }
- int x=1;
- int r=0;
- bool mul=true;
- for(deque<string>::iterator itr=tokens.begin();itr!=tokens.end();++itr){
- string& S=*itr;
- if(S=="hundred"||S=="thousand"||S=="million"){
- if(mul)
- x*=msi[S];
- else
- x=msi[S];
- mul=true;
- }
- else if(S=="and"){
- mul=true;
- }
- else{
- r+=msi[S]*x;
- mul=false;
- }
- }
- return r;
- }
- int main()
- {
- int N;
- for(cin>>N&&cin.get();N--;){
- string strnum;
- getline(cin,strnum);
- cout<<translate(strnum)<<endl;
- }
- return 0;
- }