Вопрос-Ответ

How to convert an integer to a string in any base?

Как преобразовать целое число в строку в любой базе?

Python позволяет легко создавать целое число из строки заданной базы с помощью

int(str, base). 

Я хочу выполнить обратное: создание строки из целого числа,
т.е. мне нужна некоторая функцияint2base(num, base), такая, что:

int(int2base(x, b), b) == x

Порядок имени функции / аргументов не имеет значения.

Для любого числа x и базы, b которую int() примет.

Эту функцию легко написать: на самом деле это проще, чем описать ее в этом вопросе. Однако я чувствую, что, должно быть, я что-то упускаю.

Я знаю о функциях bin, oct, hex, но я не могу их использовать по нескольким причинам:


  • Эти функции недоступны в старых версиях Python, с которыми мне нужна совместимость с (2.2)


  • Мне нужно общее решение, которое можно вызывать одинаково для разных баз


  • Я хочу разрешить базы, отличные от 2, 8, 16


Похожие

Переведено автоматически
Ответ 1

Удивительно, но люди давали только решения, которые преобразуются в малые базы (меньше длины английского алфавита). Не было попытки дать решение, которое преобразует в любую произвольную базу от 2 до бесконечности.

Итак, вот супер простое решение:

def numberToBase(n, b):
if n == 0:
return [0]
digits = []
while n:
digits.append(int(n % b))
n //= b
return digits[::-1]

итак, если вам нужно преобразовать какое-то супер огромное число в базу 577,

numberToBase(67854 ** 15 - 102, 577), даст вам правильное решение: [4, 473, 131, 96, 431, 285, 524, 486, 28, 23, 16, 82, 292, 538, 149, 25, 41, 483, 100, 517, 131, 28, 0, 435, 197, 264, 455],

Которую позже вы можете преобразовать в любую базу данных, которую захотите


  1. в какой-то момент времени вы заметите, что иногда нет встроенной библиотечной функции для выполнения того, что вы хотите, поэтому вам нужно написать свою собственную. Если вы не согласны, опубликуйте свое собственное решение со встроенной функцией, которая может преобразовать число с базой 10 в базу 577.

  2. это связано с непониманием того, что означает число в некоторой базе.

  3. Я призываю вас немного подумать, почему base в вашем методе работает только для n <= 36. Как только вы закончите, станет очевидно, почему моя функция возвращает список и имеет ту подпись, которая у нее есть.

Ответ 2

Если вам нужна совместимость со старыми версиями Python, вы можете либо использовать gmpy (который включает в себя быструю, полностью общую функцию преобразования int-в-string и может быть создан для таких старых версий – возможно, вам придется попробовать более старые версии, поскольку последние не тестировались для старых версий Python и GMP, а только для более свежих), либо, для меньшей скорости, но большего удобства, используйте код Python – например, для Python 2 проще всего использовать:

import string
digs = string.digits + string.ascii_letters


def int2base(x, base):
if x < 0:
sign = -1
elif x == 0:
return digs[0]
else:
sign = 1

x *= sign
digits = []

while x:
digits.append(digs[int(x % base)])
x = int(x / base)

if sign < 0:
digits.append('-')

digits.reverse()

return ''.join(digits)

Для Python 3, int(x / base) приводит к неверным результатам и должен быть изменен на x // base:

import string
digs = string.digits + string.ascii_letters


def int2base(x, base):
if x < 0:
sign = -1
elif x == 0:
return digs[0]
else:
sign = 1

x *= sign
digits = []

while x:
digits.append(digs[x % base])
x = x // base

if sign < 0:
digits.append('-')

digits.reverse()

return ''.join(digits)
Ответ 3
"{0:b}".format(100) # bin: 1100100
"{0:x}".format(100) # hex: 64
"{0:o}".format(100) # oct: 144
Ответ 4
def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])

ссылка:
http://code.activestate.com/recipes/65212/

Пожалуйста, имейте в виду, что это может привести к

RuntimeError: maximum recursion depth exceeded in cmp

для очень больших целых чисел.

python