José, miembro de nuestro equipo, nos ha hecho el favor de redactar este post ya que controla muy bien el tema.
Solución:
Sorprendentemente, las personas solo daban soluciones que se convertían en bases pequeñas (más pequeñas que la longitud del alfabeto inglés). No hubo ningún intento de dar una solución que se convierta a cualquier base arbitraria de 2 a infinito.
Así que aquí hay una solución súper simple:
def numberToBase(n, b):
if n == 0:
return [0]
digits = []
while n:
digits.append(int(n % b))
n //= b
return digits[::-1]
entonces, si necesita convertir un número súper enorme a la base 577
,
numberToBase(67854 ** 15 - 102, 577)
le dará una solución correcta:
[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]
,
Que luego puede convertir a cualquier base que desee
Si necesita compatibilidad con versiones antiguas de Python, puede usar gmpy (que incluye un rápido y completamente general de int-to-string función de conversión, y puede construirse para versiones tan antiguas; es posible que deba probar versiones anteriores, ya que las recientes no han sido probadas para versiones venerables de Python y GMP, solo versiones algo recientes) o, para menos velocidad pero más conveniencia, use Código de Python, por ejemplo, más simplemente:
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)
"0:b".format(100) # bin: 1100100
"0:x".format(100) # hex: 64
"0:o".format(100) # oct: 144
Tienes la opción de añadir valor a nuestro contenido informacional tributando tu veteranía en las anotaciones.