Frage

Ich versuche, ein Programm, um eine Zahl in jeder Basis zu einer anderen Basis der Wahl des Benutzers zu konvertieren. Der Code, den ich bisher haben geht so:

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

Das sind die Daten, dass ich von dem Benutzer erhalten. Die Anfangsnummer, seine Ausgangsbasis, und die Basis der Benutzer konvertieren möchte. Wie ich es verstehe, muss ich durch den Benutzer auf der Basis 10, und dann auf die gewünschte Basis, angegeben konvertieren.

Dies ist, wo ich eine Mauer schlagen: Ich brauche die linke Stelle in der ursprünglichen Zahl von seiner ursprünglichen Basis zu multiplizieren und dann die nächsten Ziffer rechts hinzufügen und dann wiederholen, bis ich die Stelle ganz rechts getroffen. Ich verstehe, wie dies auf dem Papier zu tun, aber ich habe keine Ahnung, wie es in Python-Code zu setzen. Ich bin nicht sicher, wie ich mehrfach die erste Nummer, und dann die nächsten hinzufügen, noch habe ich zu verstehen, wie das Programm wissen zu lassen, wenn die Durchführung diese Operation beenden.

Ich frage nicht, das Programm für mich geschrieben haben, aber ich möchte in der richtigen Richtung sein.

Vielen Dank für Ihre Zeit!

War es hilfreich?

Lösung

Dies sollte die erste Hälfte der Antwort auf das Problem sein. Können Sie herausfinden, wie zu einer Basis konvertieren?

# 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

Dies ist die zweite Hälfte der Lösung. Durch die Verwendung dieser beiden Funktionen, Basen Umwandlung ist sehr einfach zu tun.

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

Nachdem alles zusammen nehmen, sollten Sie mit dem Programm unten landen. Bitte nehmen Sie sich Zeit, um es herauszufinden!

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

Andere Tipps

Ich brauche die linke Stelle in der ursprünglichen Zahl von seiner innitial Basis zu multiplizieren und dann die nächsten Ziffer rechts hinzufügen und dann wiederholen, bis ich die Stelle ganz rechts getroffen.

Sie müssen also Ziffern erhalten. In einer Liste an.

Tipp 1: Verwenden Sie divmod() Funktion eine Zahl in Ziffern zu brechen. Dividiert durch 10 Dezimalstellen zu erhalten.

Hinweis 2: Während n > 0: Sie divmod() verwenden können, um einen Quotienten und einen Rest zu erhalten. Wenn Sie in der Liste speichert den Rest, und verwenden Sie die Quotienten als den neuen Wert von n Ihre Zahl wird kleiner, bis was übrig blieb, ist null und du bist fertig.

Hinweis 3: Ihre Zahlen kommen in von rechts nach links um. Verwenden Sie reverse die Reihenfolge der Liste dieser stört Sie zu wechseln. Oder erstellen Sie die Liste von insert(0,digit) verwendet wird.

Nun, da Sie die Ziffern haben. In einer Liste. Sie können durch die Liste durchlaufen.

Versuchen Sie, die for Anweisung für Größe.

Sie müssen möglicherweise eine „multiple und fügen Sie“ verwenden Schleife. total = total * new_base + next_digit ist die Art und Weise der Körper der Schleife oft sieht.

nur ein Student, langsam nach unten mit der Idee von dem, was Sie brauchen. Sie können nicht brauchen, was Sie denken, Sie brauchen.

Starten Sie am Anfang: Der Benutzer gibt eine Nummer. Der Benutzer gibt eine Basis. Diese sind beide Strings. Sprich die Basis 12 ist, und die Zahl ist 1AB3. Sie haben also einen in dem 12 ^ 3 place '1', ein 'A' in dem 12 ^ 2 place, A 'B' in 12 ^ 1, und ein '3' in dem 12 ^ 0 (Einsen) Platz. Wenn Sie diese Zahl mit der Basis wollen 10, Sie gehen zu müssen einige Zahlen addieren.

Insbesondere müssen Sie * 12 ^ 1 3 + 10 * 12 ^ 2 + 11 * 12 ^ 1 + 3 * 12 ^ 0 hinzuzufügen. Hinweis hier etwas: Sie haben 3,2,1,0. Was schön auf die Länge des Eingabestrings 1AB3 entspricht. Also wahrscheinlich eine for Schleife wäre hier hilfreich. Der Benutzer nicht eine ganze Zahl, sie Eingabe einer Zeichenfolge. So können Sie die Zeichen aus dem String benötigen, nicht die Ziffern von der Zahl.

Wie wissen Sie, was das ‚A‘ Symbole und ‚C‘ repräsentieren in Dezimalschreibweise? Schauen Sie sich die Antwort von Noctis Skytower!

So Ihre erste Aufgabe ist es, herauszufinden, wie man ITERATE durch einen String. Ihre zweite Aufgabe ist es, herauszufinden, wie die einzelnen Zeichenwerte aus der Zeichenfolge zu verwenden, das Wörterbuch in Noctis Skytower Antwort zuzugreifen und Ihre dritte Aufgabe ist es, herauszufinden, wie eine Schleife zu schreiben, die den Vorteil dieser Informationen nehmen.

Sie müssen zwei Funktionen schreiben. In Schema (da ich Schema viel besser als Python :-P wissen), werden diese beiden Funktionen genannt string->number und number->string, obwohl natürlich Sie ihnen einen Namen geben können, was Sie wollen.

Jede dieser Funktionen braucht einen Basisparameter nehmen in die Konvertierung zu tun. Sie können es bis zu 10 Standard machen, wenn Sie so wollen.

Wenn Sie jede dieser erfolgreich zu implementieren, der Rest ist ein Stück Kuchen.

Die Testfälle für Sie:

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() können Strings aus jeder Basis zwischen 2 konvertieren und 36. Wenn Sie brauchen ein breiteres Spektrum als die dann erstellen Sie eine Zeichenfolge, die Ziffern enthalten, und verwenden Sie die index() Methode den Wert zu erhalten.

Ich habe hier auf der Suche nach Abkürzungen, aber sieht aus wie keine vorhanden sind. Also hier sind die langen Methoden, die ich gefunden habe. Diese Antwort beruht auf einer Antwort auf Quoren und auch hier zu anderen Antworten zusammen.

Der einfachste Weg, (wahrscheinlich) ist eine beliebige Zahl von einer Basis b1 bis b2 zu konvertieren ist b1 zu konvertieren ? Dezimal ? b2.

Eine Zahl in der Basis b1 kann wie ein Polynom in der Basis b1 behandelt werden,

dh ein 4-stellige Nummer abcd = d * (b1 ^ 0) + c * (b1 ^ 1) + b * (b1 ^ 2) + a * (b1 ^ 3)

Eg., 123 (dezimal) = 3 * (10 ^ 0) + 2 * (10 ^ 1) + 1 * (10 ^ 2)

Also, von jeder Basis Dezimal zu konvertieren, findet die Summe aller [digit*(base^power)] (wo die Macht ist 0 bis [NumOfDigits-1]) in der umgekehrten Reihenfolge der Ziffern. Dazu behandeln die Zahl als string und durchlaufen sie eine for Schleife.

So sollte die Eingabe eine string sein und die op ein int.

Der nächste Schritt ist eine Dezimalzahl D auf Basis b2 zu konvertieren.

Teile D / b2, der Rest ist die rechte Ziffer. Teilen Sie die Quotienten mit b2, diesmal der Rest ist die nächste rechte Ziffer. Wiederholen Sie diesen Zyklus, bis der Quotient 0 ist.

Eg.,

8 (Dec) zu Binary:

8/2 = 4; 8% 2 = 0

4/2 = 2; 4% 2 = 0

2/2 = 1; 2% 2 = 0

02.01 = 0; 1% 2 = 1

8 (Dec) = 1000 (Bin)

Dies wird durch die Behandlung der Ausgangsnummer als String getan, und Umkehren der Zeichenfolge nach allen Ziffern, um es verketten. (Siehe oben: '0' + '0' + '0' + '1' ='0001', umkehren ?? '1000'

Für diese beiden Prozesse, das folgende Python-Programm tun würde:

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

Aber Sie werden feststellen, dass dieses Programm nicht praktikabel ist, während Basen mehr als 10 verwendet wird. Zu diesem Zweck müssen Sie mehr Ziffern verwenden, um Werte mehr als 0-9 darstellen. Dafür werden Sie lange if-else Leitern wählen Sie die Ziffern nach dem Nominalwert oder umgekehrt.

verwenden müssen
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]))

Fast jeder vermeidet diese lange if-else Leiter durch ein Wörterbuch mit den Nennwerten, wie Tasten und Symbole / Ziffern als ihre jeweiligen Werte. Jetzt wird das Programm wird:

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?? Ihre Hausaufgaben. Wählen Sie eine beliebige auf der those?? drei Methoden.

Um noch mehr Basen verwenden, können Sie nur das Wörterbuch erweitern und eine lange erstellen wie @ Noctis Skytower .

Jede einzelne Webseite checked ich so lange Wörterbücher hat, aber ich neige Abkürzungen für fast alles zu verwenden. Früher habe ich einfach range() Funktion, if-else Anweisungen und einfache for Schleifen um den Prozess zu verkürzen (aber ich denke, es sieht ein bisschen verwirrend, obwohl sie einfach). Der Vorteil davon ist, dass es sehr einfach mehr Basen hinzufügen, indem Sie nur einen Schlüssel, range(a,b) Zugabe, für den Bereich der Nennwerte von Ziffern, und ein Wert, range(x,y), für den Bereich des Unicode-Wertes des Zeichens für die jeweiligen Werte.

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

Dies kann auch unter Verwendung von Funktionen durchgeführt werden:

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

Wenn Sie nun das Wörterbuch erweitern, können Sie wahrscheinlich konvertieren von jeder Basis jeder Basis. ??

Dies sind einige Abkürzungen ich auf andere Stackoverflow Q-A und anderen Websites gefunden:

Zum Konvertieren von jeder nums Base zwischen 2 und 36 bis Dezimal: 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

Zur Umrechnung Dezimal in Binär-, und Hex:

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

Hope this TL;DR half jemand. Wenn jemand irgendwelche Fehler kann darauf hinweisen, bearbeiten oder kürzere Methoden bieten, werde ich dankbar sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top