Question

Je suis en train de faire un programme pour convertir un nombre dans une base à une autre base du choix de l'utilisateur. Le code que j'ai tellement va bien comme ceci:

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

Ce sont les données que je reçois de l'utilisateur. Le nombre initial, sa base initiale, et la base que l'utilisateur souhaite convertir. Si je comprends bien, je dois convertir en base 10, puis à la base désirée, spécifiée par l'utilisateur.

est où je suis frappé un mur de briques: Je dois multiplier le premier chiffre à gauche du nombre initial par sa base initiale, puis ajoutez le chiffre suivant à droite, puis répéter jusqu'à ce que je frappe le chiffre le plus à droite. Je comprends comment faire cela sur le papier, mais je ne sais pas comment le mettre en code Python. Je ne sais pas comment je multiplierait le premier numéro, puis ajoutez le suivant, et je ne comprends comment le faire savoir du programme quand arrêter d'effectuer cette opération.

Je ne demande pas d'avoir le programme écrit pour moi, mais je voudrais être pointé dans la bonne direction.

Merci pour votre temps!

Était-ce utile?

La solution

Cela devrait être la première moitié de la réponse à votre problème. Pouvez-vous comprendre comment convertir à une 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

Voici la seconde moitié de la solution. En utilisant ces deux fonctions, la conversion des bases est très facile à faire.

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

Après avoir mis tous ensemble, vous devriez finir avec le programme ci-dessous. S'il vous plaît prendre le temps de le comprendre!

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

Autres conseils

  

Je dois multiplier le chiffre du plus à gauche nombre initial par sa base innitial, puis ajoutez le chiffre suivant à droite, puis répéter jusqu'à ce que je frappe le chiffre le plus à droite.

Vous avez donc besoin d'obtenir des chiffres. Dans une liste.

Indice 1: Utilisation de la fonction divmod() pour rompre un nombre en chiffres. Diviser par 10 pour obtenir des chiffres décimaux.

Astuce 2: Alors que n > 0: vous pouvez utiliser divmod() pour obtenir un quotient et un reste. Si vous enregistrez le reste dans la liste, et d'utiliser le quotient comme la nouvelle valeur de n votre numéro devient plus petit jusqu'à ce qu'il en reste est égal à zéro et vous avez terminé.

Astuce 3: Vos chiffres arrivent dans le bon ordre à gauche. Utilisez reverse pour changer l'ordre de la liste de ces embêtements vous. Ou créer la liste en utilisant insert(0,digit).

Maintenant que vous avez les chiffres. Dans une liste. Vous pouvez parcourir la liste.

Essayez l'instruction for pour la taille.

Vous pourriez avoir besoin d'utiliser une boucle « multiple et ajouter ». total = total * new_base + next_digit est la façon dont le corps de la boucle semble souvent.

Juste un étudiant, ralentissement avec l'idée de ce dont vous avez besoin. Vous ne pouvez pas besoin de ce que vous pensez que vous avez besoin.

Démarrer au début: l'utilisateur entre un numéro. L'utilisateur saisit une base. Ce sont les deux chaînes. Dis la base est 12, et le nombre est 1AB3. Vous avez donc un '1' dans le lieu 12 ^ 3, un 'A' à la place 12 ^ 2, un 'B' dans 12 ^ 1, et un '3' dans le 12 ^ 0 (les) lieu. Si vous voulez que ce nombre en base 10, vous allez avoir besoin d'ajouter quelques chiffres ensemble.

Plus précisément, vous devez ajouter 1 * 12 ^ 3 + 10 * 12 ^ 2 + 11 * 12 ^ 1 + 3 * 12 ^ 0. Avis quelque chose: vous avez 3,2,1,0. Ce qui correspond bien à la longueur de la chaîne d'entrée 1AB3. Donc, probablement une boucle de for serait utile ici. L'utilisateur n'a pas entré un nombre entier, ils string une entrée. Vous devez donc les caractères de la chaîne, et non pas les chiffres du nombre.

Comment savez-vous ce que les symboles de A 'et « C » représentent en notation décimale? Regardez la réponse de Noctis Skytower!

Donc, votre première tâche consiste à comprendre comment itérer A STRING. Votre deuxième tâche est de savoir comment utiliser les valeurs de caractères individuels de votre chaîne pour accéder au dictionnaire dans la réponse de Noctis Skytower, et votre troisième tâche est de savoir comment écrire une boucle qui profite de cette information.

Vous devez écrire deux fonctions. Dans le schéma (puisque je sais schéma beaucoup mieux que Python :-P), ces deux fonctions sont appelées string->number et number->string, mais bien sûr, vous pouvez les nommer tout ce que vous aimez.

Chacun peut faire défaut à 10, si vous aimez ces fonctions doit prendre un paramètre de base pour effectuer la conversion en..

Une fois que vous implémentez chacun de ces succès, le reste est un morceau de gâteau.

cas de test pour vous:

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() peut convertir des chaînes de toute base entre 2 et 36. Si vous besoin d'une gamme plus large que celle puis créer une chaîne contenant les chiffres et utiliser le index() méthode pour obtenir la valeur.

Je suis venu ici chercher des raccourcis, mais ressemble à aucun exist. Voici donc les méthodes longues que j'ai trouvé. Cette réponse est basée sur une réponse à Quora et aussi liée à d'autres réponses ici.

La façon la plus simple (probablement) est de convertir un nombre quelconque d'une base b1 à b2 est de convertir b1 ? décimal ? b2.

Un certain nombre dans la base b1 peut être traité comme un polynôme dans la base b1,

-à-dire, un nombre à 4 chiffres abcd = d * (b1 ^ 0) + c * (b1 ^ 1) + b * (b1 ^ 2) + a * (b1 ^ 3)

Eg., 123 (décimal) = 3 * (10 ^ 0) + 2 * (10 ^ 1) + 1 * (10 ^ 2)

Alors, pour convertir une base décimale, trouver la somme de tous [digit*(base^power)] (où le pouvoir est de 0 à [NumOfDigits-1]) dans l'ordre inverse des chiffres. Pour cela, traiter le nombre comme string et itérer à travers elle en utilisant une boucle de for.

Ainsi, l'entrée doit être un string et op un int.

L'étape suivante consiste à convertir un nombre décimal D à la base b2.

Divide D / b2, le reste est le chiffre le plus à droite. Diviser le quotient par b2, le reste est cette fois le chiffre suivant le plus à droite. Répétez ce cycle jusqu'à ce que le quotient est 0.

Par exemple.,

8 (décembre) à binaire:

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)

Ceci est fait en traitant le numéro de sortie comme une chaîne, et d'inverser la chaîne après concaténer tous les chiffres à lui. (Voir ci-dessus: '0' + '0' + '0' + '1' ='0001', inverser ?? '1000'

Pour ces deux processus, le programme python suivant ferait:

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

Mais vous remarquerez que ce programme n'est pas pratique en utilisant des bases de plus de 10. A cet effet, vous devez utiliser plus de chiffres pour représenter des valeurs plus de 0-9. Pour cela, vous devrez utiliser des échelles longues if-else pour sélectionner les chiffres selon la valeur nominale ou vice versa.

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

Presque tout le monde évite cette longue échelle if-else en utilisant un dictionnaire avec les valeurs faciales que les clés et les symboles / chiffres que leurs valeurs respectives. Maintenant, le programme devient:

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?? vos devoirs. Sélectionnez l'une sur des those?? trois méthodes.

Pour utiliser des bases encore plus, vous pouvez simplement étendre le dictionnaire et créer une longue comme @ Noctis Skytower.

Chaque site unique je checked eu de longues dictionnaires comme ça, mais je tendance à utiliser des raccourcis pour presque tout. Je simple fonction de range(), relevés if-else et boucles de for simples pour raccourcir le processus (mais je pense qu'il semble un peu confus, en dépit d'être simples). L'avantage est qu'il est très facile d'ajouter plus de bases en ajoutant simplement une clé, range(a,b), pour la gamme des valeurs faciales des chiffres, et une valeur, range(x,y), pour la plage de valeurs Unicode des caractères pour les valeurs respectives.

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

Cela peut aussi être fait en utilisant les fonctions:

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

Maintenant, si vous pouvez étendre le dictionnaire, vous pouvez probablement convertir any base toute base . ??

Voici quelques raccourcis que je trouve sur d'autres StackOverflow Q-A et d'autres sites:

Pour convertir nums de toute base entre 2 et 36 à décimal: 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

Pour convertir décimal en binaire, octal et Hex:

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

Hope this TL;DR a aidé quelqu'un. Si quelqu'un peut signaler les erreurs, modifier ce, ou fournir des méthodes plus courtes, je serai reconnaissant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top