4,94, 910n10n 倍の数字の時の実装に注意が必要です。
ここだけ逆転しますので…

後は、11 の位から順に変換し、最後にひっくり返すと楽に(?)実装出来ます。

ちなみに自分の解法はこんな感じです。
短く書くみたいなことはな〜んにも考えてませんが!

C++
#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;
}