Answer

Answer

t.me/js_test

Ответ:

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 римских символов, где их соот.значения складываются в целое число. Эта последовательность должна быть в порядке от наибольшего к наименьшему.

Cхема алгоритма

Итак, чтобы представить данное целое число, мы ищем самый большой символ, который в него помещается. Мы вычитаем это, а затем ищем самый большой символ, который умещается в остатке, и так до тех пор, пока остаток не станет 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


Report Page