Ресурсы Android отличаются значением при переходе к функции

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

Надеюсь, это вам поможет.

1
задан BroZZZ 4 March 2019 в 09:10
поделиться

1 ответ

Вероятно, вы получаете целочисленное переполнение. Причина в том, что ваше целое число слишком велико.

В компьютерном программировании целочисленное переполнение возникает, когда арифметическая операция пытается создать числовое значение, выходящее за пределы диапазона, которое может быть представлено заданным количеством цифр - либо больше максимума, либо меньше, чем минимальное представимое значение.

См. Ссылку: https://en.wikipedia.org/wiki/Integer_overflow

Решение не работает со значениями R.id, но только передать их как ресурсы.

0
ответ дан wapn 4 March 2019 в 09:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: