【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'; } }
センスなさすぎてハゲる。