La idea es transformar un número decimal a otra forma de numeración. No es simplemente otra base (como 2 o "pasar a binario" por ejemplo), si la base fuese 2 así serían las transformación en mi sistema:
Número decimal____________Transformación
1________________________1
2________________________2
3________________________11
4________________________12
5________________________21
6________________________22
7________________________111
8________________________112
9________________________121
10_______________________122
etc.
Si en vez de ser 1 y 2 fuese 0 y 1, entonces habría casos con 0s delante. Con el método más conocido de transformación no sucede así, por eso esta es otro tipo de transformación.
Bueno, me han dado y explicado un código que por lo visto lo resuelve; les paso el original (python 3 dice) y luego un pseudo:
import math
N=int(input("Introduzca numero:"))
B=int(input("Introduzca base numerica:"))
C=0
while N>=B**C:
N = N - B**C
C+=1
lista=[]
print(N,C)
while N>0:
lista.insert(0,N%B)
N=N//B
lista=[0]*(C-len(lista)) + lista
print(lista)
N es el número decimal a traducir.
B es la base a la que traducir (nro de símbolos).
C es un contador que inicia en 0
Repetir mientras que el número sea mayor o igual a la cantidad de números generables con C cifras, lo cual se calcula haciendo B^C y en este caso es 1.
____A N, o sea al número a traducir, lle restamos B^C.
____C aumenta 1.
Fin de la repetición.
Creamos una lista vacía.
Mostramos N y C en pantalla (esto creo que es innecesario, no sé si print hace algo extra).
Comentario: Ahora inicia el método normal de transformación.
Repetir mientras el número que nos quedó sea mayor que 0
____Al inicio de la lista, colocamos el resto que nos da N/B.
____N pasa a ser el resultado de N/B, convertido a entero.
Fin del mientras.
En la lista, por delante, colocamos X cantidad de 0s, donde X es C-el largo de la lista.
También lo he traducido a mi lenguaje favorito, pero, aunque entiendo el código (supongo...)
no entiendo por qué funciona, cómo es posible que funcione, cual es la lógica, el mecanismo, el método, matemática subyacente, lo que sea. Quisiera que me lo expliquen.Primero se averigua cuántas cifras tendrá el número. Eso se hace con el 1er while, no entiendo por qué se cuenta el caso de 0 cifras pero lo básico ya está. Si por ejemplo quiero traducir el 7 a base 2 tengo que 2^0 es 1 y por tanto menor que 7, así que podemos deducir que la traducción tendrá más de 0 dígitos (es obvio pero estoy haciendo lo que me dijeron, cuando lo entienda mejor veré si se puede mejorar). 2^1 es 2 y le sumamos el 1 que teníamos, lo cual nos da 3, que sigue siendo menor que 7 por lo que ahora deducimos que la trad tendrá más de 1 cifra. 2^2 es 4 y sumado al 3 nos da 7, así que seguimos, "mientras 7 >= la cantidad de números posibles con C cifras"; deducimos que la trad tendrá más de 2 cifras. 2^3 es 8 que sumado con 7 nos da 15, así que ahora sí paramos, deducimos que la traducción tendrá 3 cifras.
La fórmula B^C puede comprobarse más o menos así:
Números que pueden formarse con 2 símbolos y 0 dígitos:
? Supuestamente es 1, no sé mucho de esto.
1, o sea 2^0
Números que pueden formarse con 2 símbolos y 1 dígito:
1, 2
2, o sea 2^1
Números que pueden formarse con 2 símbolos y 2 dígitos:
11, 12, 21, 22
4, o sea 2^2
O sea... si uno hace una lista lo puede ver mejor, fíjense por ejemplo la que mostré al inicio, si el número a traducir es 7 sabemos que tendrá 3 cifras porque es igual o menor que 2^0 + 2^1 + 2^2. Yo no tengo mucha idea, casi que me parece magia, pero en fin, es lo que puedo explicar o decir por ahora.
La segunda parte o segundo while, hace una traducción común y corriente. Simplemente no entiendo por qué al inicio no funciona y luego sí. Ojo, en realidad acá traduce la diferencia entre:
2^0 + 2^1 + 2^2 o hasta donde corresponda
y N.
En el caso de que N sea 7 la diferencia es 0, así que el while no se hace. Si se hace entonces los restos (ver método común (*)), se agregan a la lista.
(*):
Al final, agrega X 0s delante donde X es C-el largo de la lista. Eso tampoco entiendo bien por qué funciona.
En fin, gracias.