AOJ 1137 Numeral System

問題

Numeral System | Aizu Online Judge

'm'が1000、'c'が100、'x'が10、'i'が1を表す記数法で書かれた2つの数字を足して、その記数法で出力せよ

方針

与えられた文字列を左から見て10進数に変換し足し算する。和をもとの記法に戻す

コード

#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
 
#define rep(i, n) for(int i=0; i<(n); ++i)

bool isNum(const char s) {
    return s >= '0' && s <= '9';
}
int convert(const string &s) {
    int i = 0;
    int ret = 0;
    while(i < s.size()) {
        if(isNum(s[i])) {
            int n = s[i]-'0';
            if(s[i+1] == 'm') ret += n*1000; 
            if(s[i+1] == 'c') ret += n*100; 
            if(s[i+1] == 'x') ret += n*10; 
            if(s[i+1] == 'i') ret += n; 
            i += 2;
        } 
        else if(s[i] == 'm') i++, ret += 1000;
        else if(s[i] == 'c') i++, ret += 100;
        else if(s[i] == 'x') i++, ret += 10;
        else if(s[i] == 'i') i++, ret += 1;
        else i++;
    }
    return ret;
}

string reverse(int n) {
    string s;
    if(n/1000 > 0) {
        if(n/1000 > 1) {
            char c = n/1000 + '0';
            s += c;
        }
        s += 'm';
        n %= 1000;
    }
    if(n/100 > 0) {
        if(n/100 > 1) {
            char c = n/100 + '0';
            s += c;
        }
        s += 'c';
        n %= 100;
    }
    if(n/10 > 0) {
        if(n/10 > 1) {
            char c = n/10 + '0';
            s += c;
        }
        s += 'x';
        n %= 10;
    }
    if(n > 0) {
        if(n > 1) {
            char c = n + '0';
            s += c;
        }
        s += 'i';
        n %= 1000;
    }
    return s;
}

int main(void){
    int n;
    string a, b;
    int x, y;
    cin >> n;
    rep(loop, n) {
        cin >> a >> b;
        cout << reverse(convert(a) + convert(b)) << endl;
    }
}

http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=1892087

反省

さすがにもっと短く書けた (http://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=190332#1とか)