題目地址
描述
在這個問題中谁不,將用英語給你一個或多個整數(shù)藏研。你的任務(wù)是將這些數(shù)字轉(zhuǎn)換成整型表示。數(shù)字范圍從-999,999,999到999,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
輸入
輸入包括多個樣例,注意:
1.負(fù)數(shù)前面有詞negative
2.當(dāng)能用thousand的時候,將不用hundred挤聘。例如1500將寫為"one thousand five hundred",而不是"fifteen hundred".
輸入將以一個空行結(jié)束
輸出
輸出將是每一個單獨一行,每一個后面一個換行符
樣例輸入
six
negative seven hundred twenty nine
one million one hundred one
eight hundred fourteen thousand twenty two
樣例輸出
6
-729
1000101
814022
分析
million thousand hundred 其實是三個等級捅彻,利用遞歸可將各級數(shù)目相加得解组去,而利用map可以建立英語輸入和實際數(shù)字的對應(yīng)關(guān)系。
反思
大神寫這題只用800k步淹,而我寫了1300k从隆,實在是化簡不了了$择桑花的時間也不短键闺,各種調(diào)試。又犯了不少低級錯誤如局部變量全局變量寫兩次澈驼,循環(huán)括號位置錯誤等等辛燥。
#include<iostream>
#include<map>
#include<string>
#include<vector>
using namespace std;
map<string,int> book;
string abc[32]={"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"};
int mindex[3]={1000000,1000,100};
int num[32]={-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
30,40,50,60,70,80,90,100,1000,1000000};
vector<int> result;
int getn(int i,int j){ //按層次在第i和第j個數(shù)中計算和
int ans=0;
for(int p=0;p<3;++p){
for(int k=i;k<=j;++k){
if (result[k]==mindex[p]){
ans+=getn(i,k-1)*mindex[p];
i=k+1;
break;
}
}
}
for(;i<=j;++i)ans+=result[i];
return ans;
}
int main(){
for(int i=0;i<32;++i)
book.insert(make_pair(abc[i],num[i]));
while(1){
bool flag=0;
string s;
getline(cin,s); //直接輸入字符串的函數(shù)getline()
int len=s.size();
if(len==0)break;
int i=0,ans=0;
for(int j=1;j<=len;++j)
if(s[j]==' '||j==len){
result.push_back(book[s.substr(i,j-i)]);
i=j+1;
j+=2;
}
if(result[0]==-1){
flag=1;
result.erase(result.begin(),result.begin()+1);
--len;
}
if(flag)cout<<'-';
cout<<getn(0,result.size()-1)<<endl;
result.clear();
}
}