Чтобы решить эту проблему, мы должны сначала понять представление римских цифр и его принципы.
Римские цифры представлены 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] } } };
Заключение
Дайте мне знать, если вам понравился этот или если у вас есть другие решения этой проблемы.
Этот вопрос по программированию относится к среднему уровню сложности и может считаться хорошим практическим вопросом для технических интервью. Вы можете попрактиковаться в решении этой задачи на литкоде.
В моей следующей статье мы напишем программу для создания калькулятора римских цифр.