POJ 2121 Inglish-Number Translator
問題
アルファベット表記された数字を英数字に変換して表示せよ。
やりかた
数字をthousand未満、thousandの桁、millionの桁に分けて各桁を英数字に直して、桁の数字をかけて足し合わせた。
以下ソース。
int main(int argc, char **argv){ map<string, int> p; p["negative"] = -1; p["zero"] = 0; p["one"] = 1; p["two"] = 2; p["three"] = 3; p["four"] = 4; p["five"] = 5; p["six"] = 6; p["seven"] = 7; p["eight"] = 8; p["nine"] = 9; p["ten"] = 10; p["eleven"] = 11; p["twelve"] = 12; p["thirteen"] = 13; p["fourteen"] = 14; p["fifteen"] = 15; p["sixteen"] = 16; p["seventeen"] = 17; p["eighteen"] = 18; p["nineteen"] = 19; p["twenty"] = 20; p["thirty"] = 30; p["forty"] = 40; p["fifty"] = 50; p["sixty"] = 60; p["seventy"] = 70; p["eighty"] = 80; p["ninety"] = 90; p["hundred"] = 100; p["thousand"] = 1000; p["million"] = 1000000; char c[400]; while(gets(c)){ string s(c); if(s.empty()) break; stringstream ss(s); vector<string> v; while(ss >> s) v.push_back(s); reverse(ALL(v)); //桁ごとに入力を割り振る vector<string> num[4]; int digit = 0; for(int i = 0; i < v.size(); i++){ if(v[i] == "hundred" && digit < 1) digit = 1; else if(v[i] == "thousand" && digit < 2) digit = 2; else if(v[i] == "million" && digit < 3) digit = 3; else num[digit].push_back(v[i]); } //各桁について数字を計算 int ans = 0; int sign = 1; for(int i = 0; i < 4; i++){ int base = 1, val = 0; for(int j = 0; j < num[i].size(); j++){ if(p[num[i][j]] == -1) sign = -1; else if(p[num[i][j]] < 100){ val += base * p[num[i][j]]; }else{ base = p[num[i][j]]; } } if(i == 0) ans += val; if(i == 1) ans += 100 * val; if(i == 2) ans += 1000 * val; if(i == 3) ans += 1000000 * val; } cout << sign * ans << endl; } return 0; }
Get up! 明日のSUPER ST@R!