http://acm.hi-54.com/problem.php?pid=2116
题意:
汉字数字转阿拉伯数字
思路:
因为汉字的数字大部分是数字后面有个单位(万和十要特判),所以可以根据这个来做
#include <iostream>
#include <algorithm>
#include <string>
#include <string.h>
#include <math.h>
#include <vector>
#include <map>
#include <stdio.h>
#define ll long long
using namespace std;
map<string, int> msz;
map<string, int> mdw;
double getmoney(string ss) {
double money = 0;
double temp = 0;
string tt = "";
int vis = 1;
for (int i =0; i < (int)ss.length() - 4; i ++) {
string te = "";
te += ss[i] ;
te += ss[i + 1] ;
te += ss[i + 2] ;
te += ss[i + 3] ;
if (te == "ling") {
ss.erase(i, 4);
}
}
for(int i = 0; i < (int)ss.length(); i ++) {
tt += ss[i];
if(tt == "wan") {
money += temp;
money *= 10000;
temp = 0;
vis = 1;
tt = "";
}//如果出现了yibaiwan这种情况要这样处理
else if (money == 0 && tt == "shi") {
money = 10;
vis = 1;
tt = "";
temp = 0;
}//以shi开头的数字
if (vis & 1) {
int k = msz[tt];
if (k) {
vis = 0;
tt = "";
temp += k;
}
}else {
int k = mdw[tt];
if (k) {
vis = 1;
tt = "";
temp *= k;
money += temp;
temp = 0;
}
}
}
money += temp;
return money;
}
double getze(string ss) {
double res = 0.;
double kk = 0.1;
string st = "";
for (int i = 0; i < (int)ss.length(); i ++) {
st += ss[i];
int k = msz[st];
if(k || st == "ling") {
res += kk * k;
kk *= 0.1;
st = "";
}
}
return res;
}
int main() {
msz["ling"] = 0;
msz["yi"] = 1;
msz["er"] = 2;
msz["san"] = 3;
msz["si"] = 4;
msz["wu"] = 5;
msz["liu"] = 6;
msz["qi"] = 7;
msz["ba"] = 8;
msz["jiu"] = 9;//数值
mdw["bai"] = 100;
mdw["qian"] = 1000;
mdw["shi"] = 10;
mdw["wan"] = 10000;//单位
string a, b, c;
while(cin >> a >> b >> c) {
int vis = 0;
if(a == "yuanjia")
vis = 1;
double money = getmoney(b);
double zejou = getze(c);
double kmoney;
if(vis) {
kmoney = money * zejou;
printf("%.2lf %.2lf\n", money, kmoney);
}
else if(!vis) {
kmoney = money / zejou;
printf("%.2lf %.2lf\n", kmoney, money);
}
}
return 0;
}