Как преобразовать большое число в базу 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
- Получите любой язык, который может обрабатывать произвольно большие целые числа. Ruby, Python, Haskell, вы называете это.
- Выполните базовый шаг: по модулю 36 вы получите следующую цифру, деление на 36 даст вам номер с вырезанной последней цифрой.
- Сопоставьте цифры с символами так, как вам нравится. Например,
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'[digit]
Я в порядке. Добавляйте цифры к результату по мере их производства. - ???
- Вернуть объединенную строку цифр. Прибыль!