Страницы

Поиск по вопросам

суббота, 6 октября 2018 г.

Перевод числа в римскую систему счисления

Сегодня нашел задачу для перевода числа в римскую систему счисления. Как многие знают римляне не использовали отрицательных значений, ноль и дроби.
Решил задачу следующим образом:
function convertToRoman(number) { let roman = { "M": 1000, "CM": 900, "D": 500, "CD": 400, "C": 100, "XC": 90, "L": 50, "XL": 40, "X": 10, "IX": 9, "V": 5, "IV": 4, "I": 1 }; let result = ""; for (var i of Object.keys(roman)) { var repeat = Math.floor(number / roman[i]); number -= repeat * roman[i]; result += i.repeat(repeat); } return result; } //Тесты для примера console.log(convertToRoman(100)); console.log(convertToRoman(5789)); console.log(convertToRoman(952)); console.log(convertToRoman(782));
Можно ли решить эту задачу за наименьшее количество операций?


Ответ

Решение через reduce
Выглядит не тривиально, но время исполнения в 2.5 раза быстрее при 100 повторах подряд. function convertToRoman(number) { return [ { value: 1000, char: 'M' }, { value: 900, char: 'CM' }, { value: 500, char: 'D' }, { value: 400, char: 'CD' }, { value: 100, char: 'C' }, { value: 90, char: 'XC' }, { value: 50, char: 'L' }, { value: 40, char: 'XL' }, { value: 10, char: 'X' }, { value: 9, char: 'IX' }, { value: 5, char: 'V' }, { value: 4, char: 'IV' }, { value: 1, char: 'I' } ].reduce((result, currentValue) => { while (number >= currentValue.value) { result += currentValue.char; number -= currentValue.value; } return result; }, ''); } //Тесты для примера console.log(convertToRoman(100)); console.log(convertToRoman(5789)); console.log(convertToRoman(952)); console.log(convertToRoman(782));
Предлагайте свои решения, кому интересно.

Комментариев нет:

Отправить комментарий