您的位置:首页 > 其它

ZOJ 2971 Give Me the Number

2018-04-04 16:06 288 查看
题意:给出一个数的英文表达,写出这个数
思路:模拟题,比赛的时候第一眼看到这题认为有点繁琐,就没有写,后来过这个题的人有很多,在还剩不到40分钟的时候写的这个题,写的时候脑子有点乱,有些细节没有注意,回到宿舍静下心来想了想,其实没有那么复杂,重新写了一遍,1次AC,我是这样写的,用一个string数组保存输入,记录下来单词millon和thousand的位置,这样就可以吧输入分为三个部分,然后在写一个把每一部分转换位数字的函数,提前用map数组存一下所对应的值,遇到hundred是乘以100,遇到and跳过,遇到其它的单词,就加上它所表示的数字#include <stdio.h>
#include <iostream>
#include <string>
#include <map>

using namespace std;

map<string,int> mp;
string a[50];

int f(int l,int r){
int ans = 0;
for(int i = l; i <= r; i++){
if(a[i] != "and"){
if(a[i] == "hundred"){
ans *= 100;
}
else{
ans += mp[a[i]];
}
}
}
return ans;
}
int main(void){
int n;
cin >> n;
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;
mp["hundred"] = 100;
while(n--){
int cnt = 0;
char c;
while(1){
cin >> a[cnt++];
c = getchar();
if(c == '\n'){
break;
}
}
if(a[0] == "zero"){
cout << 0 << endl;
continue;
}
//cout << cnt << endl;
int posm = -1;
int post = -1;

for(int i = 0; i < cnt; i++){
if(a[i] == "million"){
posm = i;
}
if(a[i] == "thousand"){
post = i;
}
}

int ans = 0;
if(posm != -1){
ans += f(0,posm) * 1000000;
if(post != -1){
ans += f(posm + 1,post) * 1000;
ans += f(post + 1,cnt - 1);
}
else{
ans += f(posm + 1,cnt - 1);
}
}
else if(post != -1){
ans += f(0,post) * 1000;
ans += f(post + 1,cnt - 1);
}
else{
ans += f(0,cnt - 1);
}
cout << ans << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: