#include #include #include using namespace std; void Make_Roman(int val, string& result, int& prefix){ result = ""; 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}; 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"}; while(val > 0){ int pos = 0; while(val < bases[pos]) pos++; val = val-bases[pos]; if(pos != 0) result = result + romans[pos]; else prefix++; } } void Sort(vector& v){ for(int i = 0; i < v.size(); i++){ for(int j = 0; j < v.size()-1; j++){ if(v[j] > v[j+1]){ string temp = v[j]; v[j] = v[j+1]; v[j+1] = temp; } } } } int Find(const vector& v, string key){ for(int i = 0; i < v.size(); i++) if(v[i] == key) return i; cout << "Uh-Oh, can't find " << key << endl; return -1; } int main(){ // I should figure out exactly what numerals correspond to what numbers, // but I'm lazy vector roman_list; for(int i = 1; i < 1000; i++){ int prefix; // not used here string roman; Make_Roman(i, roman, prefix); roman_list.push_back(roman); } Sort(roman_list); // put all numbers < 1000 in alphabetical order // find where things go past M int big_start = 0; while(roman_list[big_start] < "M") big_start++; int n; cin >> n; for(int i = 0; i < n; i++){ int val; cin >> val; string roman; int prefix = 0; Make_Roman(val, roman, prefix); if(roman.size() == 0){ // it's all M's cout << prefix*(big_start + 1) << endl; } else if(roman[0] < 'M'){ // count from start int result = Find(roman_list, roman) +1 + prefix*(big_start + 1); cout << result << endl; } else{ int result = roman_list.size() - Find(roman_list, roman); result = result * -1 - prefix*(roman_list.size()-big_start); cout << result << endl; } } return 0; }