Как преобразовать большое число в базу 36, используя DC или другой

Я пытаюсь представить максимальное 64-разрядное значение без знака в разных базах.

Для базы 2 (двоичной) это будет 64 1:

    1111111111111111111111111111111111111111111111111111111111111111

Для базы 16 (гекс) это будет 16 F

    FFFFFFFFFFFFFFFF

Для основы 10 (десятичной) это будет:

    18446744073709551615

Я пытаюсь получить представление этого значения в базе 36 (он использует 0-9 и AZ). Существует много базовых онлайн-конвертеров, но все они не могут дать правильное представление, потому что они ограничены 64-битной математикой.

Кто-нибудь знает, как использовать DC (который является чрезвычайно сложным в использовании математических процессоров, которые могут обрабатывать числа неограниченной величины) и знает, как сделать это преобразование? Или это, или кто-нибудь может сказать мне, как я могу выполнить это преобразование с калькулятором, который не потерпит неудачу из-за целочисленного пролонгации?

3 ответа

Решение

Я с ума схожу от быстрого теста с ruby:

i = 'FFFFFFFFFFFFFFFF'.to_i(16)
puts i               #18446744073709551615
puts i.to_s(36)      #3w5e11264sgsf

Вы также можете использовать большие числа:

i = 'FFFFFFFFFFFFFFFF'.to_i(16) ** 16
puts i                  
puts i.to_s(36)      

результат:

179769313486231590617005494896502488139538923424507473845653439431848569886227202866765261632299351819569917639009010788373365912036255753178371299382143631760131695224907130882552454362167933328609537509415576609030163673758148226168953269623548572115351901405836315903312675793605327103910016259918212890625
1a1e4vngailcqaj6ud31s2kk9s94o3tyofvllrg4rx6mxa0pt2sc06ngjzleciz7lzgdt55aedc9x92w0w2gclhijdmj7le6osfi1w9gvybbfq04b6fm705brjo535po1axacun6f7013c4944wa7j0yyg93uzeknjphiegfat0ojki1g5pt5se1ylx93knpzbedn29

Краткое объяснение того, что происходит с большими числами:

Нормальные числа Fixnums, Если вы получите большее число, номер становится Bignum:

small = 'FFFFFFF'.to_i(16)
big = 'FFFFFFFFFFFFFFFF'.to_i(16) ** 16

puts "%i is a %s" % [ small, small.class ]
puts "%i\n is a %s" % [ big, big.class ]
puts "%i^2 is a %s" % [ small, (small ** 2).class ]

Результат:

268435455 is a Fixnum
179769313486231590617005494896502488139538923424507473845653439431848569886227202866765261632299351819569917639009010788373365912036255753178371299382143631760131695224907130882552454362167933328609537509415576609030163673758148226168953269623548572115351901405836315903312675793605327103910016259918212890625
 is a Bignum
268435455^2 is a Bignum

Из документации Бигнума:

Объекты Bignum содержат целые числа вне диапазона Fixnum. Bignum объекты создаются автоматически, когда целочисленные вычисления в противном случае переполняют Fixnum. Когда вычисление с использованием объектов Bignum возвращает результат, который будет помещен в Fixnum, результат автоматически конвертируется.

Это можно сделать с помощью DC, но вывод не очень полезен.

$ dc
36
o
16
i
FFFFFFFFFFFFFFFF
p
 03 32 05 14 01 01 02 06 04 28 16 28 15

Вот объяснение:

Ввод номера сам по себе толкает этот номер

o выталкивает стек и устанавливает основание вывода.

i выталкивает стек и устанавливает основание ввода.

p печатает верхнее число в стеке в текущем радиусе вывода. Тем не менее, dc печатает любой вывод с более высоким основанием, чем 16, в двоичном формате (не ASCII).

В dc все команды могут быть помещены в одну строку, например так:

$ dc
36o16iFFFFFFFFFFFFFFFFp
 03 32 05 14 01 01 02 06 04 28 16 28 15
  1. Получите любой язык, который может обрабатывать произвольно большие целые числа. Ruby, Python, Haskell, вы называете это.
  2. Выполните базовый шаг: по модулю 36 вы получите следующую цифру, деление на 36 даст вам номер с вырезанной последней цифрой.
  3. Сопоставьте цифры с символами так, как вам нравится. Например, '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[digit] Я в порядке. Добавляйте цифры к результату по мере их производства.
  4. ???
  5. Вернуть объединенную строку цифр. Прибыль!
Другие вопросы по тегам