の 倍の数字の時の実装に注意が必要です。
ここだけ逆転しますので…
後は、 の位から順に変換し、最後にひっくり返すと楽に(?)実装出来ます。
ちなみに自分の解法はこんな感じです。
短く書くみたいなことはな〜んにも考えてませんが!
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
// --- 初期設定(入出力の高速化と小数15桁出力) ---
struct Init {
Init() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout << fixed << setprecision(15);
}
} init;
// ------------------------------------------------
int paturnNum(int n) {
if (n < 4) {
return 1;
} else if (n == 4) {
return 2;
} else if (n < 9) {
return 3;
} else {
return 4;
}
}
string makeRoman(string rompat, int n) {
string rom;
for (int i = 0; i < n; i++) {
rom += rompat;
}
return rom;
}
int main() {
int n;
cin >> n;
vector<string> rom1(4);
rom1[0] = "I";
rom1[1] = "VI";
rom1[2] = "V";
rom1[3] = "XI";
vector<string> rom10(4);
rom10[0] = "X";
rom10[1] = "LX";
rom10[2] = "L";
rom10[3] = "CX";
vector<string> rom100(4);
rom100[0] = "C";
rom100[1] = "DC";
rom100[2] = "D";
rom100[3] = "MC";
int dig = 1;
string ans;
while (n != 0) {
int get = n % 10;
int pat = paturnNum(get);
switch (dig) {
case 1:
switch (pat) {
case 1:
ans += makeRoman(rom1[0], get);
break;
case 2:
ans += rom1[1];
break;
case 3:
ans += makeRoman(rom1[0], get - 5);
ans += rom1[2];
break;
case 4:
ans += rom1[3];
break;
default:
break;
}
break;
case 2:
switch (pat) {
case 1:
ans += makeRoman(rom10[0], get);
break;
case 2:
ans += rom10[1];
break;
case 3:
ans += makeRoman(rom10[0], get - 5);
ans += rom10[2];
break;
case 4:
ans += rom10[3];
break;
default:
break;
}
break;
case 3:
switch (pat) {
case 1:
ans += makeRoman(rom100[0], get);
break;
case 2:
ans += rom100[1];
break;
case 3:
ans += makeRoman(rom100[0], get - 5);
ans += rom100[2];
break;
case 4:
ans += rom100[3];
break;
default:
break;
}
break;
case 4:
ans += makeRoman("M", get);
break;
default:
break;
}
n /= 10;
++dig;
}
reverse(ans.begin(), ans.end());
cout << ans << "\n";
return 0;
}