Pregunta

Estoy intentando hacer un programa para convertir un número en cualquier base a otra base de la elección del usuario. El código que tengo hasta ahora es la siguiente:

innitvar = float(raw_input("Please enter a number: "))
basevar = int(raw_input("Please enter the base that your number is in: "))
convertvar = int(raw_input("Please enter the base that you would like to convert to: "))

Estos son los datos que recibo por parte del usuario. El número inicial, su base inicial, y la base de que el usuario desee convertir. Como lo entiendo, necesito para convertir a la base 10, y luego a la base deseada, especificado por el usuario.

Aquí es donde estoy golpeando una pared de ladrillos: lo que necesito para multiplicar el dígito más a la izquierda en el número inicial de su base inicial, y luego añadir el siguiente dígito a la derecha, y luego repetir hasta que llegué a la dígito de la derecha. Me entender cómo hacer esto en el papel, pero no tengo ni idea de cómo poner en código Python. No estoy seguro de cómo iba a multiplicar el primer número, y luego añadir el siguiente, ni me entiendo cómo hacer que el programa sepa cuándo desistir de realizar esta operación.

No te pido tener el programa escrito para mí, pero me gustaría estar en punta en la dirección correcta.

Gracias por su tiempo!

¿Fue útil?

Solución

Esta debe ser la primera mitad de la respuesta a su problema. Se puede encontrar la manera de convertir a una base?

# Create a symbol-to-value table.
SY2VA = {'0': 0,
         '1': 1,
         '2': 2,
         '3': 3,
         '4': 4,
         '5': 5,
         '6': 6,
         '7': 7,
         '8': 8,
         '9': 9,
         'A': 10,
         'B': 11,
         'C': 12,
         'D': 13,
         'E': 14,
         'F': 15,
         'G': 16,
         'H': 17,
         'I': 18,
         'J': 19,
         'K': 20,
         'L': 21,
         'M': 22,
         'N': 23,
         'O': 24,
         'P': 25,
         'Q': 26,
         'R': 27,
         'S': 28,
         'T': 29,
         'U': 30,
         'V': 31,
         'W': 32,
         'X': 33,
         'Y': 34,
         'Z': 35,
         'a': 36,
         'b': 37,
         'c': 38,
         'd': 39,
         'e': 40,
         'f': 41,
         'g': 42,
         'h': 43,
         'i': 44,
         'j': 45,
         'k': 46,
         'l': 47,
         'm': 48,
         'n': 49,
         'o': 50,
         'p': 51,
         'q': 52,
         'r': 53,
         's': 54,
         't': 55,
         'u': 56,
         'v': 57,
         'w': 58,
         'x': 59,
         'y': 60,
         'z': 61,
         '!': 62,
         '"': 63,
         '#': 64,
         '$': 65,
         '%': 66,
         '&': 67,
         "'": 68,
         '(': 69,
         ')': 70,
         '*': 71,
         '+': 72,
         ',': 73,
         '-': 74,
         '.': 75,
         '/': 76,
         ':': 77,
         ';': 78,
         '<': 79,
         '=': 80,
         '>': 81,
         '?': 82,
         '@': 83,
         '[': 84,
         '\\': 85,
         ']': 86,
         '^': 87,
         '_': 88,
         '`': 89,
         '{': 90,
         '|': 91,
         '}': 92,
         '~': 93}

# Take a string and base to convert to.
# Allocate space to store your number.
# For each character in your string:
#     Ensure character is in your table.
#     Find the value of your character.
#     Ensure value is within your base.
#     Self-multiply your number with the base.
#     Self-add your number with the digit's value.
# Return the number.

def str2int(string, base):
    integer = 0
    for character in string:
        assert character in SY2VA, 'Found unknown character!'
        value = SY2VA[character]
        assert value < base, 'Found digit outside base!'
        integer *= base
        integer += value
    return integer

Aquí está la segunda mitad de la solución. Mediante el uso de estas dos funciones, la conversión de bases es muy fácil de hacer.

# Create a value-to-symbol table.
VA2SY = dict(map(reversed, SY2VA.items()))

# Take a integer and base to convert to.
# Create an array to store the digits in.
# While the integer is not zero:
#     Divide the integer by the base to:
#         (1) Find the "last" digit in your number (value).
#         (2) Store remaining number not "chopped" (integer).
#     Save the digit in your storage array.
# Return your joined digits after putting them in the right order.

def int2str(integer, base):
    array = []
    while integer:
        integer, value = divmod(integer, base)
        array.append(VA2SY[value])
    return ''.join(reversed(array))

Después de poner todo junto, que debe terminar con el siguiente programa. Por favor tome tiempo para averiguarlo!

innitvar = raw_input("Please enter a number: ")
basevar = int(raw_input("Please enter the base that your number is in: "))
convertvar = int(raw_input("Please enter the base that you would like to convert to: "))

# Create a symbol-to-value table.
SY2VA = {'0': 0,
         '1': 1,
         '2': 2,
         '3': 3,
         '4': 4,
         '5': 5,
         '6': 6,
         '7': 7,
         '8': 8,
         '9': 9,
         'A': 10,
         'B': 11,
         'C': 12,
         'D': 13,
         'E': 14,
         'F': 15,
         'G': 16,
         'H': 17,
         'I': 18,
         'J': 19,
         'K': 20,
         'L': 21,
         'M': 22,
         'N': 23,
         'O': 24,
         'P': 25,
         'Q': 26,
         'R': 27,
         'S': 28,
         'T': 29,
         'U': 30,
         'V': 31,
         'W': 32,
         'X': 33,
         'Y': 34,
         'Z': 35,
         'a': 36,
         'b': 37,
         'c': 38,
         'd': 39,
         'e': 40,
         'f': 41,
         'g': 42,
         'h': 43,
         'i': 44,
         'j': 45,
         'k': 46,
         'l': 47,
         'm': 48,
         'n': 49,
         'o': 50,
         'p': 51,
         'q': 52,
         'r': 53,
         's': 54,
         't': 55,
         'u': 56,
         'v': 57,
         'w': 58,
         'x': 59,
         'y': 60,
         'z': 61,
         '!': 62,
         '"': 63,
         '#': 64,
         '$': 65,
         '%': 66,
         '&': 67,
         "'": 68,
         '(': 69,
         ')': 70,
         '*': 71,
         '+': 72,
         ',': 73,
         '-': 74,
         '.': 75,
         '/': 76,
         ':': 77,
         ';': 78,
         '<': 79,
         '=': 80,
         '>': 81,
         '?': 82,
         '@': 83,
         '[': 84,
         '\\': 85,
         ']': 86,
         '^': 87,
         '_': 88,
         '`': 89,
         '{': 90,
         '|': 91,
         '}': 92,
         '~': 93}

# Take a string and base to convert to.
# Allocate space to store your number.
# For each character in your string:
#     Ensure character is in your table.
#     Find the value of your character.
#     Ensure value is within your base.
#     Self-multiply your number with the base.
#     Self-add your number with the digit's value.
# Return the number.

integer = 0
for character in innitvar:
    assert character in SY2VA, 'Found unknown character!'
    value = SY2VA[character]
    assert value < basevar, 'Found digit outside base!'
    integer *= basevar
    integer += value

# Create a value-to-symbol table.
VA2SY = dict(map(reversed, SY2VA.items()))

# Take a integer and base to convert to.
# Create an array to store the digits in.
# While the integer is not zero:
#     Divide the integer by the base to:
#         (1) Find the "last" digit in your number (value).
#         (2) Store remaining number not "chopped" (integer).
#     Save the digit in your storage array.
# Return your joined digits after putting them in the right order.

array = []
while integer:
    integer, value = divmod(integer, convertvar)
    array.append(VA2SY[value])
answer = ''.join(reversed(array))

# Display the results of the calculations.
print answer

Otros consejos

necesito para multiplicar el dígito más a la izquierda en el número inicial por su base Innitial, y luego añadir el siguiente dígito a la derecha, y luego repetir hasta que llegué a la dígito de la derecha.

Por lo que necesita para obtener cifras. En una lista.

Pista 1: Utilice la función divmod() para romper un número en dígitos. Dividir por 10 para obtener dígitos decimales.

Pista 2: Mientras n > 0: se puede usar divmod() para obtener un cociente y un resto. Si guarda el resto de la lista, y utilizar el cociente como el nuevo valor de n su número se hace más pequeño hasta lo que queda es cero y ya está.

Pista 3: Sus cifras llegan a fin de derecha a izquierda. Utilice reverse para cambiar el orden de la lista de esta te molesta. O crear la lista mediante insert(0,digit).

Ahora que tiene los dígitos. En una lista. Se puede recorrer la lista.

Trate la declaración for en el tamaño.

Es posible que necesite usar un "múltiple y añadir" bucle. total = total * new_base + next_digit es la forma en que el cuerpo del bucle se ve a menudo.

Sólo un estudiante, desaceleración con la idea de lo que necesita. Puede que no necesite lo que cree que necesita.

empezar por el principio: el usuario introduce un número. El usuario introduce una base. Estas son las dos cadenas. Decir que la base es 12, y el número es 1AB3. Por lo que tiene un '1' en el 12 ^ 3 lugar, una 'A' en el lugar 12 ^ 2, una 'B' en 12 ^ 1, y un '3' en el ^ 0 (los) lugar 12. Si desea que este número en base 10, vas a tener que añadir algunos números.

Específicamente, es necesario agregar 1 * 12 ^ 3 + 10 * 12 ^ 2 + 11 * 12 ^ 1 + 3 * 12 ^ 0. Aviso algo aquí: usted tiene 3,2,1,0. Que se corresponde muy bien a la longitud de la cadena de entrada 1AB3. Así que, probablemente, un bucle for sería útil aquí. La llama no ingresa un número entero, que una cadena de entrada. Por lo que necesita los caracteres de la cadena, no los dígitos del número.

¿Cómo sabes lo que 'A' los símbolos y 'C' representan en notación decimal? Mira la respuesta de Noctis skytower!

Así que su primera tarea es encontrar la manera de iterar a través de una cadena. Su segunda tarea consiste en encontrar la manera de utilizar los valores de caracteres individuales de la cadena para acceder al diccionario en la respuesta de Noctis Skytower, y su tercera tarea es encontrar la manera de escribir un bucle que se aprovecha de esa información.

Usted tiene que escribir dos funciones. En el Esquema (Esquema ya que sé mucho mejor que Python :-P), esas dos funciones se llaman string->number y number->string, aunque por supuesto puede poner nombres a ellos lo que quiera.

Cada una de esas necesidades funciones para tomar un parámetro de base para hacer la conversión. Puede que sea por defecto a 10, si te gusta.

Una vez que se implementa cada uno de los éxito, el resto es un juego de niños.

Los casos de prueba para usted:

assert str2num('1234', 10) == 1234
assert str2num('1234', 16) == 0x1234
assert num2str(1234, 10) == '1234'
assert num2str(1234, 16) == '4d2'
assert num2str(0x1234, 16) == '1234'

int() puede convertir cadenas de cualquier base entre 2 y 36. Si necesita una gama más amplia de lo que a continuación, crear una cadena que contiene los dígitos y utilizar el index() método para obtener el valor.

He venido aquí en busca de atajos Pero parece que no los hay. Así que aquí están los métodos largos que he encontrado. Esta respuesta se basa en una respuesta a Quora y también en relación con otras respuestas aquí.

La forma más fácil (probablemente) es convertir cualquier número de una b1 base para b2 es convertir b1 ? decimal ? b2.

Un número en la base de b1 puede ser tratado como un polinomio en la b1 base,

es decir, un número abcd 4 dígitos = d * (b1 ^ 0) + c * (b1 ^ 1) + b * (b1 ^ 2) + a * (b1 ^ 3)

Ej., 123 (decimal) = 3 * (10 ^ 0) + 2 * (10 ^ 1) + 1 * (10 ^ 2)

Por lo tanto, convertir de cualquier base a decimal, hallar la suma de todos los [digit*(base^power)] (donde el poder es de 0 a [NumOfDigits-1]) en el orden inverso al de los dígitos. Para esto, tratar el número como un string e iterar a través de él mediante un bucle for.

Por lo tanto, la entrada debe ser una string y el op un int.

El siguiente paso es convertir un número decimal D a b2 base.

Divide D / b2, el resto es el dígito más a la derecha. Se divide el cociente por b2, el resto esta vez es el siguiente dígito más a la derecha. Repita este ciclo hasta que el cociente es 0.

Ej.,

8 (Dec) a binario:

8/2 = 4; 8% 2 = 0

4/2 = 2; 4% 2 = 0

2/2 = 1; 2% 2 = 0

1/2 = 0; 1% 2 = 1

8 (Dec) = 1000 (Bin)

Esto se hace tratando el número de salida como una cadena, y la inversión de la cadena después de la concatenación de todos los dígitos a la misma. (Ver arriba: '0' + '0' + '0' + '1' ='0001', revertirla ?? '1000'

En estos dos procesos, el siguiente programa de pitón haría:

    N=input("Num:")
    B1=int(input("FromBase:"))
    B2=int(input("ToBase:"))
    print("Base[",B1,"]:",N)

    #From Base B1 to Decimal
    DN=0
    for i in range(len(N)):
        DN+= int(N[::-1][i]) * (B1 ** i)
    print("Decimal:",DN)

    #From Decimal to Base B2
    if int(N) == 0:
        BN = 0
    else:
        BN = ""
        while DN > 0:
            BN += str(DN % B2)
            DN = int(DN / B2)
    print("Base[",B2,"]:",int(BN[::-1]))

Sin embargo, usted notará que este programa no es práctico durante el uso de bases de más de 10. Para este propósito, es necesario utilizar más dígitos para representar valores de más de 0-9. Para que usted tendrá que utilizar escaleras if-else largos para seleccionar los dígitos según el valor nominal o viceversa.

N=input("Num:")
B1=int(input("FromBase:"))
B2=int(input("ToBase:"))
print("Base[",B1,"]:",N)

#From Base B1 to Decimal
DN=0
for i in range(len(N)):
    if N[::-1][i] == '0':
        DN += 0 * (B1 ** i)
    elif N[::-1][i] == '1':
        DN += 1 * (B1 ** i)
    elif N[::-1][i] == '2':
        DN += 2 * (B1 ** i)
    '''    :
           :       '''
    elif N[::-1][i] == 'A':
        DN += 10 * (B1 ** i)
    '''    :
           :  (fill it) ....
           :       '''
print("Decimal:",DN)

#From Decimal to Base B2
if int(N) == 0:
    BN = 0
else:
    BN = ""
    while DN > 0:
        R = DN % B2
        if R==0:
            BN += '0'
        elif R==1:
            BN += '1'
        elif R==2:
            BN += '2'
        '''     :
                :
                :       '''
        elif R==10:
            BN += 'A'
        '''     :
                :
                :       '''
        DN = int(DN / B2)
print("Base[",B2,"]:",int(BN[::-1]))

Casi todo el mundo evita esta escalera if-else tiempo mediante el uso de un diccionario con los valores nominales como llaves y los símbolos / dígitos como sus respectivos valores. Ahora el programa se convierte en:

Dig={0: '0', 1: '1', 2: '2', 3: '3', 4: '4', 5: '5', 6: '6', 7: '7', 8: '8', 9: '9', 10: 'A', 11: 'B', 12: 'C', 13: 'D', 14: 'E', 15: 'F', 16: 'G', 17: 'H', 18: 'I', 19: 'J'}

N=input("Num:")
B1=int(input("FromBase:"))
B2=int(input("ToBase:"))
print("Base[",B1,"]:",N)

#From Base B1 to Decimal
DN=0
for i in range(len(N)):
    for fv in Dig:
        if Dig[fv]== N[::-1][i]:    # FaceValue of the Digit
            DN+= fv * (B1 ** i)
print("Decimal:",DN)

#From Decimal to Base B2
if N == '0':
    BN = 0
else:
    BN = ""
    while DN > 0:
        BN += Dig[DN % B2]          # Digit for the Value
        DN = int(DN / B2)
print("Base[",B2,"]:",BN[::-1])

??There's?? su tarea. Seleccione cualquiera de los métodos de those?? tres.

Para usar incluso más bases, sólo puede ampliar el diccionario y crear uno largo como @ Noctis skytower .

Cada sitio web solo he comprobado tenía diccionarios largas como esa, pero tienden a utilizar atajos para casi todo. Solía ??función simple range(), declaraciones if-else y bucles for simples para acortar el proceso (pero creo que se ve un poco confuso, a pesar de ser simple). La ventaja de esto es que es muy fácil añadir más bases con sólo añadir una clave, range(a,b), para la gama de valores nominales de dígitos, y un valor, range(x,y), para la gama de valores Unicode de los caracteres de los valores respectivos.

Val = {range(10):range(48, 58), range(10,36): range(65, 91)}

N=input("Num:")
B1=int(input("FromBase:"))
B2=int(input("ToBase:"))
print("Base[",B1,"]:",N)

#From Base B1 to Decimal
DN = 0
for i in range(len(N)):
    for j in Val:
        if ord(N[i]) in Val[j]:
            FV=j[ord(N[i])-Val[j][0]]       # FaceValue of the Digit
    if FV>= B1:                             # Digits aren't >=Base, right?
        print("Base Error..")
        exit()
    else:
        DN += FV * (B1 ** (len(N) - 1 - i))
print("Decimal:",DN)

#From Decimal to Base B2
if int(DN) == 0:
    BN = '0'
else:
    BN = ""
    while DN > 0:
        R = DN % B2
        for i in Val:
            if R in i:
                BN+=chr(Val[i][R-i[0]])     #Finding the Digit for the Value
        DN = int(DN / B2)
print("Base[", B2, "]:", BN[::-1])

Esto también se puede hacer uso de las funciones:

Val = {range(10):range(48, 58), range(10,36): range(65, 91)}

def B2D(N,B1):
    '''From Base B1 to Decimal'''
    DN = 0
    for i in range(len(N)):
        for j in Val:
            if ord(N[i]) in Val[j]:
                FV=j[ord(N[i])-Val[j][0]]       # FaceValue of the Digit
        if FV>= B1:                             # Digits aren't >=Base, right?
            print("Base Error..")
            exit()
        else:
            DN += FV * (B1 ** (len(N) - 1 - i))
    return DN

def D2B(DN,B2):
    '''From Decimal to Base B2'''
    if int(DN) == 0:
        BN = '0'
    else:
        BN = ""
        while DN > 0:
            R = DN % B2
            for i in Val:
                if R in i:
                    BN+=chr(Val[i][R-i[0]])     #Finding the Digit for the Value
            DN = int(DN / B2)
    return BN[::-1]

def B2B(N,B1,B2):
    return D2B(B2D(N,B1),B2)

N=input("Num:")
B1=int(input("FromBase:"))
B2=int(input("ToBase:"))
print("Base[",B1,"]:",N)
print("Decimal:",B2D(N,B1))
print("Base[",B2,"]:",B2B(N,B1,B2))

Ahora, si se puede ampliar el diccionario, es probable que pueda convertir de cualquier base para cualquier base. ??

Estos son algunos atajos que encontré en otra Stackoverflow Q-A y otros sitios web:

Para convertir nums de cualquier base entre 2 y 36 a decimal: int(‘NumberString’,Base)

>>> int('1000',2)
8
>>> int('100',12)
144
>>> int('AA',17)
180
>>> int('Z',36)
35
>>> int('Z',37)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: int() base must be >= 2 and <= 36, or 0

Para convertir decimal en binario, octal y hexadecimal:

>>> bin(8)
'0b1000'
>>> oct(8)
'0o10'
>>> hex(8)
'0x8'

Espero que esto ayudó TL;DR alguien. Si alguien puede señalar los errores de edición, este, o proporcionar métodos más cortos, estaré agradecido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top