Domanda

Sto cercando di fare un programma per convertire un numero in qualsiasi base ad un'altra base della scelta dell'utente. Il codice che ho finora va in questo modo:

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: "))

Questi sono i dati che ricevo da parte dell'utente. Il numero iniziale, la sua base iniziale, e la base che l'utente desidera convertire. A quanto ho capito, ho bisogno di convertire in base 10, e poi alla base desiderata, specificato dall'utente.

Questo è dove sto colpendo un muro di mattoni: Ho bisogno di moltiplicare la cifra più a sinistra del numero iniziale per la sua base iniziale, e quindi aggiungere la cifra successiva a destra, e poi ripetere fino a quando ho colpito la cifra più a destra. Capisco come fare questo sulla carta, ma non ho idea di come mettere in codice Python. Non sono sicuro di come avrei moltiplicare il primo numero, e quindi aggiungere il prossimo, né capisco come lasciare il know programma quando per fermare l'esecuzione di questa operazione.

Non sto chiedendo di avere il programma scritto per me, ma mi piacerebbe essere a punta nella direzione giusta.

Grazie per il vostro tempo!

È stato utile?

Soluzione

Questa dovrebbe essere la prima metà della risposta al vostro problema. Si può capire come convertire ad 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

Questa è la seconda parte della soluzione. Utilizzando queste due funzioni, la conversione di basi è molto facile da fare.

# 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))

Dopo aver messo tutto insieme, si dovrebbe finire con il programma qui di seguito. Si prega di prendere tempo per capirlo!

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

Altri suggerimenti

  

Ho bisogno di moltiplicare la cifra più a sinistra del numero iniziale per la base innitial, e quindi aggiungere la cifra successiva a destra, e poi ripetere fino a quando ho colpito la cifra più a destra.

Quindi, è necessario per ottenere cifre. In un elenco.

Suggerimento 1: Utilizzare la funzione divmod() per rompere un numero in cifre. Dividere per 10 per ottenere cifre decimali.

Suggerimento 2: Mentre n > 0: è possibile utilizzare divmod() per ottenere un quoziente e un resto. Se si salva il resto della lista, e utilizzare il quoziente come nuovo valore di n il tuo numero si riduce fino a ciò che è rimasto è pari a zero e il gioco è fatto.

Suggerimento 3: Il tuo cifre arrivano in modo da destra a sinistra. Utilizzare reverse per cambiare l'ordine della lista di questo vi da fastidio. O creare l'elenco utilizzando insert(0,digit).

Ora che avete le cifre. In un elenco. È possibile scorrere la lista.

Prova la dichiarazione for su per dimensioni.

Potrebbe essere necessario utilizzare un "multiple e aggiungere" loop. total = total * new_base + next_digit è il modo in cui il corpo del ciclo appare spesso.

solo uno studente, rallentare con l'idea di che cosa avete bisogno. Potrebbe non essere necessario quello che pensi di aver bisogno.

Inizio all'inizio: l'utente immette un numero. L'utente immette una base. Queste sono entrambe le stringhe. Say la base è 12, e il numero è 1AB3. In modo da avere un '1' nel 12 ^ 3 posto, una 'A' al posto 12 ^ 2, una 'B' in 12 ^ 1, e di un '3' nel ^ 0 (quelli) posto 12. Se si desidera che questo numero in base 10, si sta andando ad avere bisogno di aggiungere alcuni numeri.

In particolare, è necessario aggiungere 12 ^ 1 * 3 + 10 * 12 ^ 2 + 11 * 12 ^ 1 + 3 * 12 ^ 0. Avviso qualcosa qui: avete 3,2,1,0. Che corrisponde esattamente alla lunghezza del 1AB3 stringa di input. Quindi probabilmente un ciclo for sarebbe utile qui. L'utente non fornisce un numero intero, si stringa un ingresso. Quindi è necessario i caratteri dalla stringa, non le cifre del numero.

Come fai a sapere che cosa 'A' simboli e 'C' rappresentare in notazione decimale? Guardate la risposta da Noctis Skytower!

Così il vostro primo compito è quello di capire come scorrere una stringa. Il vostro secondo compito è quello di capire come utilizzare i singoli valori dei caratteri dalla stringa per accedere al dizionario nella risposta di Noctis Skytower, e il vostro terzo compito è quello di capire come scrivere un ciclo che si avvale di tali informazioni.

È necessario scrivere due funzioni. Nello Schema (poiché so Scheme molto meglio di Python :-P), queste due funzioni sono chiamate string->number e number->string, anche se naturalmente è possibile chiamare quello che vuoi.

Ognuno di questi bisogni funzioni per prendere un parametro di base per eseguire la conversione in. Si può rendere di default a 10, se vi piace.

Una volta che si sceglie di implementare ciascuno di quelli con successo, il resto è un pezzo di torta.

Casi di test per voi:

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() in grado di convertire le stringhe da qualsiasi base tra 2 e 36. Se si bisogno di una gamma più ampia di quella quindi creare una stringa contenente le cifre e utilizzare il index() metodo per ottenere il valore.

Sono venuto qui in cerca di scorciatoie ma sembra che ancora non esistono. Così qui sono i lunghi metodi che ho trovato. Questa risposta si basa su una risposta all'indirizzo Quora e anche in relazione ad altre risposte qui.

Il modo più semplice (probabilmente) è quello di convertire qualsiasi numero da una base per b1 b2 è quello di convertire b1 ? Decimale ? b2.

Un numero b1 base può essere trattato come un polinomio in b1 base,

Per esempio, un numero di 4 cifre abcd = d * (b1 ^ 0) + c * (b1 ^ 1) + b * (b1 ^ 2) + a * (b1 ^ 3)

Es., 123 (decimale) = 3 * (10 ^ 0) + 2 * (10 ^ 1) + 1 * (10 ^ 2)

Quindi, convertire da qualsiasi base al decimale, trovare la somma di tutti [digit*(base^power)] (dove il potere è da 0 a [NumOfDigits-1]) in ordine inverso delle cifre. Per questo, trattare il numero come string e iterare attraverso di esso utilizzando un ciclo for.

Quindi, l'ingresso dovrebbe essere un string e l'op un int.

Il passo successivo è quello di convertire un numero decimale D b2 base.

Divide D / b2, il resto rappresenta la cifra più a destra. Dividere il quoziente per b2, il resto questa volta è la cifra successiva a destra. Ripetere questo ciclo fino a quando il quoziente è 0.

Eg.,

8 (Dec) per Binary:

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 (dic) = 1000 (Bin)

Questa operazione viene eseguita trattando il numero di uscita come stringa, e invertire la stringa dopo concatenando tutte le cifre ad esso. (Vedi sopra: '0' + '0' + '0' + '1' ='0001', rovesciarla ?? '1000'

Per questi due processi, il seguente programma python avrebbe fatto:

    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]))

Ma si noterà che questo programma non è pratico durante l'utilizzo di basi più di 10. A tale scopo, è necessario utilizzare più cifre per rappresentare i valori più di 0-9. Per questo si dovrà utilizzare scale if-else lunghi per selezionare le cifre secondo il valore nominale 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]))

Quasi tutti evita questo lunga scala if-else utilizzando un dizionario con i valori nominali come chiavi ed i simboli / cifre come i loro rispettivi valori. Ora il programma diventa:

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?? i compiti a casa. Selezionare qualsiasi su di those?? tre metodi.

Per usare ancora di più basi, si può solo ampliare il dizionario e creare una lunga uno come @ Noctis Skytower .

Ogni singolo sito ho controllato avuto dizionari lunghe del genere, ma io tendo a usare le scorciatoie per quasi tutto. Ho usato semplice funzione range(), dichiarazioni if-else e semplici loop for per abbreviare il processo (ma credo che sembra un po 'di confusione, pur essendo semplice). Il vantaggio di questo è che è molto facile aggiungere più basi semplicemente aggiungendo una chiave, range(a,b), per la gamma di valori nominali delle cifre, e un valore, range(x,y), per la gamma di valori Unicode dei caratteri per i rispettivi valori.

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])

Questo può anche essere fatto utilizzando funzioni:

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))

Ora, se è possibile espandere il dizionario, probabilmente si può convertire da qualsiasi base per qualsiasi di base. ??

Queste sono alcune scorciatoie che ho trovato su altri StackOverflow Q-A e altri siti web:

Per convertire nums da qualsiasi base tra 2 e 36 a decimale: 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

Per convertire i decimali in binario, ottale, e Hex:

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

Spero che questo TL;DR aiutato qualcuno. Se qualcuno può segnalare eventuali errori, modificare questo, o fornire metodi più brevi, sarò grato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top