Hex to Decimal


0

function hexToDecimal(hex){
let symbol = '',
length = hex.length,
result = 0;
for (let i = 0; i < length; i += 1) {
symbol = hex.charAt(i);
if (symbol === "A") {
result += (10*Math.pow(16,(length-i-1)));
}
else if (symbol === "B") {
result += (11*Math.pow(16,(length-i-1)));
}
else if (symbol === "C") {
result += (12*Math.pow(16,(length-i-1)));
}
else if (symbol === "D") {
result += (13*Math.pow(16,(length-i-1)));
}
else if (symbol === "E") {
result += (14*Math.pow(16,(length-i-1)));
}
else if (symbol === "F") {
result += (15*Math.pow(16,(length-i-1)));
}
else {
result += (+symbol*Math.pow(16,(length-i-1)));
}
}
console.log(result);
}

Това е кодът ми към задачата. Тествах го в конзолата на Google Chrome и всичко работи, всяко едно число си го обръща от 16-тично в 10-тично. BGCoder обаче е категоричен, че в кода има проблем и това е .charAt(i).

evalmachine.<anonymous>:6

symbol = hex.charAt(i);

     ...

Приемам предложения или съвети къде може да е грешката ми? Отново казвам кодът ми в конзолата на Хром работи безпроблемно.




Отговори



0

и от мен 

function solve(args) {
    var n = args[0],
        length = n.length,
        result=0;


    for (var i = 0; i < length; i++) {
        result += Math.pow(16, length - i-1) * RetrunNumber(n[i]);
    }

    console.log(result);

    function RetrunNumber(n) {
        switch (n) {
            case '0': return 0;
            case '1': return 1;
            case '2': return 2;
            case '3': return 3;
            case '4': return 4;
            case '5': return 5;
            case '6': return 6;
            case '7': return 7;
            case '8': return 8;
            case '9': return 9;
            case 'A': return 10;
            case 'B': return 11;
            case 'C': return 12;
            case 'D': return 13;
            case 'E': return 14;
            case 'F': return 15;
        }
    };
}




0
Извинявай би ли могъл да обясниш тези няколко реда моля,другите разбрах какво точно правят ,но тези тук не мога да ги разбера добре.Виждам че се връщат стойностите на F = 15 и Е = 14 но не виждам къде ги връща точно и прави калкулацията с тях и на дебъгера не виждам къде или просто незнам къде да натисна за да видя как се случват точно изчисленията. Ще съм много благодарен ако напишеш няколко реда да го обясниш просто.
    result=0;


    for (var i = 0; i < length; i++) {
        result += Math.pow(16, length - i-1) * RetrunNumber(n[i]);      
    }


0

Идеята е че ако вземем 16-тично число, за да го превърнем в десетично всеки символ е равен на 16 на степен позицията (i) умножено по стойността си (в случая стойността на символа се смята от функцията ReturnNumber()).

Например за числото ABC,

А = 162 * 10   (десетичната стойност на А е 10)

B = 161 * 11  (десетичната стойност на А е 11)

C = 160 * 12 (десетичната стойност на А е 12)

Като съберем резултата получаваме 2560 + 176 + 12 = 2748.

Аналогията е същата както се образуват десетичните числа, примерно числото 456 е

102 * 4 + 101 * 5 + 100 * 6.

Само дето при 16-тична система използваме 16 вместо 10 и умножаваме по стойността на символа (от 0 до 15).

Това е обяснението на формулата в кода, извинявам се на автора ако съм объркал нещо.


от ZachD (273 точки)



1

Само да добавя, че знам за възможностите на parseInt и че с три реда код програмата ще си върви, дори го пробвах и работи в BGCoder, но все пак лекцията е ЦИКЛИ и не вярвам точно това решение да искат..

function hextodecimal(hex) {
return parseInt(hex, 16);
}


от dnstoyanov (5 точки)


0

код работещ 100 % :

function solve(params) {
    var hex = params[0];
    var res = 0;
    var sixTeen = 1;

    for (var i = hex.length - 1; i >= 0; i-=1) {
        var chNow = hex[i];
        if (+chNow >= 0 && +chNow < 10) {
            res += +chNow * sixTeen;
            sixTeen *= 16;
        } else if (chNow == 'A') {
            res += 10 * sixTeen;
            sixTeen *= 16;
        } else if (chNow == 'B') {
            res += 11 * sixTeen;
            sixTeen *= 16;
        } else if (chNow == 'C') {
            res += 12 * sixTeen;
            sixTeen *= 16;
        } else if (chNow == 'D') {
            res += 13 * sixTeen;
            sixTeen *= 16;
        } else if (chNow == 'E') {
            res += 14 * sixTeen;
            sixTeen *= 16;
        } else if (chNow == 'F') {
            res += 15 * sixTeen;
            sixTeen *= 16;
        }
    }
    console.log(res);


от webdesign (52 точки)


0

Мисля, че прекалено си усложняваш живота, според мен с един switch case става по-лесно

'use strict'; function solve(args) { let hex = args[0], dec = 0, temp = 0, len = +hex.length, reversedString = reverse(hex); for (let i = 0; i <= len - 1; i += 1) { switch (reversedString[i]) { case 'A': temp = 10; break; case 'B': temp = 11; break; case 'C': temp = 12; break; case 'D': temp = 13; break; case 'E': temp = 14; break; case 'F': temp = 15; break; default: temp = reversedString[i]; break; } dec += temp * Math.pow(16, i); } console.log(dec); function reverse(str) { let result = ''; for (let i = str.length - 1; i >= 0; i--) result += str[i]; return result; } } solve(['FE']); solve(['4ED528CBB4']);


от olebg (598 точки)


0

Здравейте,

На мен този код ми се чупи на проверка с '4ED528CBB4' и бгкодър дава 80\100.

function solve(args) { var hex = args[0], num = 0; for (var x = 0; x < hex.length; x++) { var hexdigit = parseInt(hex[x], 16); num = (num << 4) | hexdigit; } console.log(num); }


от Pessinger (50 точки)


0
Би ли споделил какво е "num = (num << 4) | hexdigit;" и защо го правиш :?

от Smytt_kp (115 точки)

0

По този начин се измества побитово числото num с 4 бита на ляво и освобождава последните (десните) 4 бита за да се заместят с тези от hexdigit (където hexdigit е цифра в шестнадесетичната бройна система, на която са необходими 4 цифри от двоичната бройна система за да се представи побитово). Този подход може да се ползва при превръщане от една броина система в друга, когато и двете са с основа равна на степен на 2.

Мисля че проблемът в случая е че при 20% от тестовете се променя съответния бит(32 - рия по ред, ако броим от 1), който отговаря за знака на числото.А в задачата се иска 64 битово число като резултат , при което значещия бит е 64 - и по ред.


от ludzhev (132 точки)



0

Реших да споделя едно доста по-опростено решение на задачата Цък.

1) Като ползваме ASCII таблицата разликата между char position - 'A' + 10 би дало като резултата 10,11,12,13,14,15 без да се ползва switch

2)Не се ползва Math.pow понеже той работи бавно, а се ползва цикъла който да направи степен на base(16)


от ktsvetanov (705 точки)