Основная проблема решения Марселя заключается в том, что в качестве заполнителя используется ноль.При преобразовании между основаниями неизбежно, что число, выбранное для представления 0, не может появиться в начале преобразованного числа.
Например, если вы преобразуете целые числа 10 из 10 в основание 4, используя «ABCD», используя предоставленный механизм, нет способа получить вывод, который начинается с буквы «А», так как он представляет ноль в новой базе и не будет префиксом числа.Вы можете ожидать, что 5 будет «AA», но вместо этого это «BA».Нет никакого способа принудить этот алгоритм к созданию "AA", потому что это было бы похоже на запись "00" в десятичном виде, который имеет то же значение, что и "0".
Вот альтернативное решение в PHP, которое используетвся гамма:
function encode($n, $alphabet = 'ABCD') {
$output = '';
if($n == 0) {
$output = $alphabet[0];
}
else {
$digits = floor(log($n, strlen($alphabet))) + 1;
for($z = 0; $z < $digits; $z++) {
$digit = $n % 4;
$output = $alphabet[$digit] . $output;
$n = floor($n / 4) - 1;
}
}
return $output;
}
function decode($code, $alphabet = 'ABCD') {
$n = 0;
$code = str_split($code);
$unit = 1;
while($letter = array_pop($code)) {
$n += (strpos($alphabet, $letter) + 1) * $unit;
$unit = $unit * strlen($alphabet);
}
return $n - 1;
}
echo encode(25); // should output "ABB"
echo decode('ABB'); // should output 25
Изменить / передать второй параметр в список символов для использования вместо короткого 4-символьного словаря "ABCD".