Кодирование очень больших чисел в строки

Я пытался закодировать очень большие целые числа в последовательности заглавных букв, используя PHP. присваивая значения от 0 до 25 для A ~ Z, я сократил 1 млрд до DGEHTYM. если достигается работающий алгоритм, использующий разные регистры, числа и даже символы, результирующая строка может быть намного короче. моя цель, однако, — просто строки заглавных букв, возможно, с цифровыми символами, чтобы сделать его короче, но не обязательно.

кодировать с помощью ручки, бумаги и калькулятора моего телефона:

  • найти высшую силу 26 ниже 1 миллиарда (php имеет функцию log для этого). за 1 миллиард это 6. так 26 ^ 6 = 308 915 776.
  • 1000000000 от 308915776 является 3,237 с большим количеством десятичных знаков
  • 3 является D. мы получили наше первое письмо!
  • теперь мы будем делать одно и то же снова и снова, пока не получим целое число: убрать всю часть и умножить оставшиеся десятичные дроби на 26. все, что мы вынимаем, — это письмо. за 1 миллиард я зациклился 6 раз, пока не получил 12, что M.

может быть, есть более разумный способ сделать это, но я не понял этого.

возможно, я должен был сделать это по-другому, но из-за отсутствия лучшего способа я попытался повторить свои вычисления в PHP, но у меня были проблемы: 1: очень трудно кодировать числа, которые закодированы будут заканчиваться (0) такой как 1326 который был бы BZA и 2: мне не удалось заставить PHP определить, имеет ли число десятичное число или нет. Я должен был продолжать преобразовывать его в строку и искать точку.

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

D => 3 x (26^6) = 926,747,328
G => 6 x (26^5) = 71,288,256
E => 4 x (26^4) = 1,827,904
H => 3 x (26^3) = 123,032
T => 19 x (26^2) = 12,844
Y => 24 x 26 = 624
M => 12
926,747,328 + 71,288,256 + 1,827,904 + 123,032 + 12,844 + 624 + 12 = 1,000,000,000

есть похожий вопрос Вот но те, кто ответил, похоже, не понимали, чего пытался достичь ФП.

1

Решение

Вы переводите из базы 10 в 26, это в диапазоне, который встроенные функции, такие как base_convert или же gmp_strval может справиться. Они дадут цифры в виде 0-9 и a-p, поэтому вам просто нужно перевести их в то, что вы хотите с strtr.

$translate = array_combine(
array_merge(range(0, 9), range('a', 'p')),
range('A', 'Z')
);

echo strtr(base_convert(1000000000, 10, 26), $translate), "\n";
echo strtr(base_convert(1326, 10, 26), $translate), "\n";

//Or if you're working with really big numbers (beyond PHP_INT_MAX):
echo strtr(gmp_strval(1000000000, 26), $translate), "\n";
echo strtr(gmp_strval(1326, 26), $translate);

Выход:

DGEHTYM
BZA
DGEHTYM
BZA

Или сделать это вручную, что позволит легко добавлять / удалять символы для разных баз и кодировок. По сути, вы делите свой входной номер на основание, используйте остаток, чтобы найти соответствующий символ для этой позиции, а затем повторите с результатом деления.

function base10_to_whatevs($num, array $digits)
{
$result = '';
$base = count($digits);
while ($num > 0) {
$remainder = $num % $base;
$num = ($num - $remainder) / $base;
$result = $digits[$remainder] . $result;
}
return $result;
}

$letters = range('A', 'Z');
echo base10_to_whatevs(1000000000, $letters), "\n";
echo base10_to_whatevs(1326, $letters);
DGEHTYM
BZA
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]