Римские цифры в некотором смысле позиционные, просто каждая позиция может иметь несколько символов, представляющих десятичную цифру, символы изменяются с десятичной величиной, и нули в качестве заполнителей не используются.
Так что используйте справочные таблицы таким образом:
// Decimal digit lookup tables
static const char* thousands[] = { "", "M", "MM", "MMM" } ;
static const char* hundreds[] = { "", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM" } ;
static const char* tens[] = { "", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC" } ;
static const char* units[] = { "", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX" } ;
static const char** digits[] = { thousands, hundreds, tens, units } ;
Затем для каждой десятичной цифры слева направо (начиная с тысяч), найдите «цифры [величина] [десятичное]» в приведенной выше таблице поиска и добавьте подстроку к выводу. Обратите внимание, что для нуля нет римской цифры, поэтому нули просто опускаются.
Так, например, 1234 будет переведено в «M» + «CC» + «XXX» + «IV» = «MCCXXXIV».
Чтобы понять, как это работает, посмотрите объяснение римских цифр на Википедия: Римские цифры - символы в частности, последняя таблица в разделе «Символы» (т. Е. Проведите исследование - даже если вы думаете, что понимаете предмет!). Обратите внимание, что для чисел, превышающих 3999, требуются символы не ASCII, поэтому мои таблицы ограничены от 1 до 3999, но вы можете исправить это с помощью решения Unicode, возможно.
Сделав это один раз для собеседования, у меня есть полностью проработанная реализация, основанная на приведенных выше таблицах, но я ее опускаю, так как вы делаете это для развлечения, и было бы неинтересно, возможно, сделать это для вас. Однако, если вам нужны дополнительные указатели или подсказки, или даже целое решение, просто спросите.