Чтобы решить эту проблему, мы должны сначала понять представление римских цифр и его принципы.

Римские цифры представлены 7 различными символами:

  • I (1)
  • V (5)
  • X (10)
  • L (50)
  • C (100)
  • D (500)
  • M (1000)

На основе этих символов у нас есть некоторые предопределенные принципы. Например:

1 - I
2 - II
3 - III

Однако 4 не представляется как IIII
Поскольку у нас есть V для представления 5, вычитание из него единицы даст нам 4, которое будет определено как IV.

Этот же принцип применим и к другим римским числам. Например: I можно поставить перед V и X. Точно так же X можно поставить перед L и C, а C можно поставить перед D и M.

Теперь, когда мы знаем принципы, мы реализуем это решение на JavaScript.

В соответствии с вышеуказанными принципами мы начнем нашу программу с хранения уникальных комбинаций в массивах:

const values = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
const romans =["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]

Наши входные данные для программы будут целыми числами, и мы сравним эти входные данные с массивом values, чтобы определить диапазон, в который попадает число, то есть от 1 до 4, от 5 до 9, от 100 до 400 и т. д.

Основываясь на диапазоне, мы начнем сохранять результат в строковой переменной result и продолжим конкатенацию, пока не получим окончательный результат (т. е. мы будем использовать цикл while).

let result = ""
    
for (let i = 0; num >0; i++) {
 while (num >= values[i]) {
    result += roman[i]
    num -= values[i]
 }
}

Например:

Если наш ввод 445, то он лежит между 400 и 500, а 445 меньше 500, поэтому разбиение будет => 445 = 400 + 45.

result = CD + 45

На следующей итерации цикла while мы проверим диапазон для 45, т.е. он лежит между 40 и 50, а так как 45 меньше 50, то разбиение будет =›
45 = 40 + 5

result = result + XL + V = CDXLV

Таким образом, нашим окончательным результатом будет CDXLV.

Полное решение:

const values = [1000,900,500,400,100,90,50,40,10,9,5,4,1]
const romans =["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]
const intToRoman = function(num) {
    for (let i = 0; num >0; i++) {
      while (num >= values[i]) {
        result += roman[i]
        num -= values[i]
     }
   }
};

Заключение

Дайте мне знать, если вам понравился этот или если у вас есть другие решения этой проблемы.

Этот вопрос по программированию относится к среднему уровню сложности и может считаться хорошим практическим вопросом для технических интервью. Вы можете попрактиковаться в решении этой задачи на литкоде.

В моей следующей статье мы напишем программу для создания калькулятора римских цифр.