解いた問題のソースコードと解説など。


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!