Римские числа
Ответ:
const convertIntToRoman = (n) => {
if (n >= 1000) return 'M' + convertIntToRoman(n - 1000);
if (n >= 500)
return n >= 900
? 'CM' + convertIntToRoman(n - 900)
: 'D' + convertIntToRoman(n - 500);
if (n >= 100)
return n >= 400
? 'CD' + convertIntToRoman(n - 400)
: 'C' + convertIntToRoman(n - 100);
if (n >= 50)
return n >= 90
? 'XC' + convertIntToRoman(n - 90)
: 'L' + convertIntToRoman(n - 50);
if (n >= 10)
return n >= 40
? 'XL' + convertIntToRoman(n - 40)
: 'X' + convertIntToRoman(n - 10);
if (n >= 5) return n == 9 ? 'IX' : 'V' + convertIntToRoman(n - 5);
if (n > 0) return n == 4 ? 'IV' : 'I' + convertIntToRoman(n - 1);
return '';
};
Объяснение:
Для начала давайте выпишем всевозможные римские цифры, которые мы будем использовать:
- 7 однобуквенных символов, каждый со своим значением;
- правила вычитания дают дополнительные 6 символов.
I — 1, IV — 4, V — 5, IX — 9, X — 10, XL — 40, L — 50, XC — 90, C — 100, CD — 400, D — 500, CM — 900, M — 1000
Получаем, что представить целое число в виде римской цифры, необходимо найти последовательность из 13 римских символов, где их соответствующие значения складываются в целое число. Эта последовательность должна быть в порядке от наибольшего к наименьшему.

Итак, чтобы представить данное целое число, мы ищем самый большой символ, который в него помещается. Мы вычитаем это, а затем ищем самый большой символ, который умещается в остатке, и так до тех пор, пока остаток не станет 0. Каждый из извлеченных символов добавляется к выходной строке римских цифр.
Код для проверки:
const convertIntToRoman = (n) => {
if (n >= 1000) return 'M' + convertIntToRoman(n - 1000);
if (n >= 500)
return n >= 900
? 'CM' + convertIntToRoman(n - 900)
: 'D' + convertIntToRoman(n - 500);
if (n >= 100)
return n >= 400
? 'CD' + convertIntToRoman(n - 400)
: 'C' + convertIntToRoman(n - 100);
if (n >= 50)
return n >= 90
? 'XC' + convertIntToRoman(n - 90)
: 'L' + convertIntToRoman(n - 50);
if (n >= 10)
return n >= 40
? 'XL' + convertIntToRoman(n - 40)
: 'X' + convertIntToRoman(n - 10);
if (n >= 5) return n == 9 ? 'IX' : 'V' + convertIntToRoman(n - 5);
if (n > 0) return n == 4 ? 'IV' : 'I' + convertIntToRoman(n - 1);
return '';
};
console.log(convertIntToRoman(3)); // III
console.log(convertIntToRoman(4)); // IV
console.log(convertIntToRoman(9)); // IX
console.log(convertIntToRoman(58)); // LVIII
console.log(convertIntToRoman(1994)); // MCMXCIV