Ну, похоже, я не единственный, кто застрял в этой проблеме на FreeCodeCamp. Но я хотел бы поделиться своим кодом с вами в любом случае. Это довольно впечатляюще, почти на 10% быстрее, чем топ-голосованное решение здесь (я не тестировал все остальные, и я думаю, что мой не самый быстрый). Но я думаю, что это чисто и легко понять:
function convertToRoman(num) {
// Some error checking first
if (+num > 9999) {
console.error('Error (fn convertToRoman(num)): Can\'t convert numbers greater than 9999. You provided: ' + num);
return false;
}
if (!+num) {
console.error('Error (fn convertToRoman(num)): \'num\' must be a number or number in a string. You provided: ' + num);
return false;
}
// Convert the number into
// an array of the numbers
var arr = String(+num).split('').map((el) => +el );
// Keys to the roman numbers
var keys = {
1: ['', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'],
2: ['', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
3: ['', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM'],
4: ['', 'M', 'MM', 'MMM', 'MMMM', 'MMMMM', 'MMMMMM', 'MMMMMMM', 'MMMMMMMM', 'MMMMMMMMM'],
};
// Variables to help building the roman string
var i = arr.length;
var roman = '';
// Iterate over each number in the array and
// build the string with the corresponding
// roman numeral
arr.forEach(function (el) {
roman += keys[i][el];
i--;
});
// Return the string
return roman;
}
Это может показаться ограничением, что он может конвертировать только числа до 9 999. Но дело в том, что от 10 000 и выше строка должна быть выше над литералами. И что я еще не решил.
Надеюсь, это вам поможет.
Вероятно, вы получаете целочисленное переполнение. Причина в том, что ваше целое число слишком велико.
В компьютерном программировании целочисленное переполнение возникает, когда арифметическая операция пытается создать числовое значение, выходящее за пределы диапазона, которое может быть представлено заданным количеством цифр - либо больше максимума, либо меньше, чем минимальное представимое значение.
blockquote>См. Ссылку: https://en.wikipedia.org/wiki/Integer_overflow
Решение не работает со значениями
R.id
, но только передать их как ресурсы.