日々精進

aikoと旅行とプログラミング

【AOJ 1377】Numeral System

問題概要

  • "m","c","x","i" の4個の文字と "2","3","4","5","6","7","8","9" の8個の数字を使ったMCXI文字列が与えられる。
  • 文字列中に,"m","c","x","i" の各文字はたかだか1回現れる。
  • 文字 "m","c","x","i" は,それぞれ 1000,100,10,1 を表し, 数字 "2",...,"9" は,それぞれ 2,...,9 を表す。
  • 文字xcxiの表す値と、文字の前に現れる数字の積の総和が表す数字となる。
  • 2つのMCXI文字列がN組与えられるので、それぞれの組の和をMCXI文字列にして出力して下さい。

ソースコード

バグらせたので時間掛かった。

#include <iostream>
#include <map>
#include <vector>

#define rep(i,n) for(int i = 0 ; i < n ; i++)

using namespace std;

int main(){
  int n;
  map<char, int> mp;

  mp['m'] = 1000;
  mp['c'] = 100;
  mp['x'] = 10;
  mp['i'] = 1;

  cin >> n;
  rep(k, n){
    string s[2];
    int sum = 0, num = 1;
    cin >> s[0] >> s[1];
    rep(i,2){
      num=1;
      rep(j, (int)s[i].length()){
    if('2' <= s[i][j] && s[i][j] <= '9'){
      num = s[i][j] - '0'; 
    }else{
      sum += num * mp[s[i][j]];
      num = 1;
    }
      }
    }

    int a, b, c, d;
    a = b = c = 0;
    
    a = sum/1000;
    sum = sum % 1000;
  
    b = sum/100;
    sum = sum%100;
  
    c = sum/10;
    d = sum%10;
  
    vector<char> ans;
    if(a>=1){
      if(a > 1) ans.push_back(a+'0');
      ans.push_back('m');
    }
    
    if(b>=1){
      if(b > 1) ans.push_back(b+'0');
      ans.push_back('c');
    }
    
    if(c>=1){
      if(c > 1) ans.push_back(c+'0');
      ans.push_back('x');
    }
    
    if(d>=1){
      if(d > 1) ans.push_back(d+'0');
      ans.push_back('i');
    }

    rep(i, (int)ans.size()) cout << ans[i];
    cout << '\n';   
  }
  
}  

センスなさすぎてハゲる。