1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <string> #include <iostream> #include <algorithm> #include <vector>
using namespace std;
const int bases[28] = {1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; const string romans[28] = {"M", "CM", "DCCC", "DCC", "DC", "D", "CD", "CCC", "CC", "C", "XC", "LXXX", "LXX", "LX", "L", "XL", "XXX", "XX", "X", "IX", "VIII", "VII", "VI", "V", "IV", "III", "II", "I"};
void make_roman(int x, string &ans, int &prefix) { ans = ""; while (x > 0) { int pos = 0; while (x < bases[pos]) pos++; x = x - bases[pos]; if (pos != 0) ans = ans + romans[pos]; else prefix++; } }
int Find(const vector<string> &v, string &key) { for (int i = 0; i < v.size(); i++) if (v[i] == key) return i; return -1; }
vector<string> list;
int main() { for (int i = 1; i < 1000; i++) { int prefix = 0; string roman; make_roman(i, roman, prefix); list.push_back(roman); } sort(list.begin(), list.end()); int big_start = 0; while (list[big_start] < "M") big_start++;
int n; cin >> n; for (int i = 0; i < n; i++) { int x; cin >> x; string roman; int prefix = 0; make_roman(x, roman, prefix); if (roman.size() == 0) { cout << prefix * (big_start + 1) << endl; } else if (roman[0] < 'M') { int ans = Find(list, roman) + 1 + prefix * (big_start + 1); cout << ans << endl; } else { int ans = list.size() - Find(list, roman); ans = ans * -1 - prefix * (list.size() - big_start); cout << ans << endl; } } return 0; }
|