6 Stimmen

Python - Hausaufgaben - Umwandlung einer beliebigen Basis in eine beliebige Basis

Ich versuche, ein Programm zu erstellen, das eine Zahl in einer beliebigen Basis in eine andere Basis nach Wahl des Benutzers umwandelt. Der Code, den ich bis jetzt habe, geht wie folgt:

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

Dies sind die Daten, die ich vom Benutzer erhalte. Die Ausgangszahl, ihre Ausgangsbasis und die Basis, in die der Benutzer umrechnen möchte. So wie ich es verstehe, muss ich zur Basis 10 konvertieren und dann in die gewünschte Basis, die der Benutzer angibt.

An dieser Stelle stoße ich auf eine Mauer: Ich muss die äußerste linke Ziffer der Ausgangszahl mit ihrer Ausgangsbasis multiplizieren, dann die nächste Ziffer rechts daneben addieren und das Ganze wiederholen, bis ich die äußerste rechte Ziffer erreiche. Ich weiß, wie man das auf dem Papier macht, aber ich habe keine Ahnung, wie ich das in Python-Code umsetzen soll. Ich bin mir nicht sicher, wie ich die erste Zahl multiplizieren und dann die nächste addieren soll, und ich weiß auch nicht, wie ich dem Programm mitteilen kann, wann es mit dieser Operation aufhören soll.

Ich verlange nicht, dass das Programm für mich geschrieben wird, aber ich möchte gerne einen Hinweis auf die richtige Richtung erhalten.

Vielen Dank für Ihre Zeit!

10voto

Noctis Skytower Punkte 20111

Dies dürfte die erste Hälfte der Antwort auf Ihr Problem sein. Können Sie herausfinden, wie man in eine Basis umrechnet?

# 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

Hier ist die zweite Hälfte der Lösung. Mit diesen beiden Funktionen ist das Umrechnen von Basen sehr einfach.

# 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 Sie alles zusammengefügt haben, sollten Sie das unten stehende Programm erhalten. Bitte nehmen Sie sich die Zeit, 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

5voto

S.Lott Punkte 371691

Ich muss die äußerste linke Ziffer der Ausgangszahl mit ihrer Ausgangsbasis multiplizieren, dann die nächste Ziffer rechts daneben addieren und dann den Vorgang wiederholen, bis ich die äußerste rechte Ziffer erreiche.

Sie müssen also Zahlen bekommen. In einer Liste.

Tipp 1: Verwenden Sie divmod() Funktion, um eine Zahl in Ziffern zu zerlegen. Teilen Sie durch 10, um Dezimalstellen zu erhalten.

Hinweis 2: Während n > 0: Sie können verwenden divmod() um einen Quotienten und einen Rest zu erhalten. Wenn Sie den Rest in der Liste speichern und den Quotienten als neuen Wert von n Ihre Zahl wird immer kleiner, bis nur noch Null übrig ist und Sie fertig sind.

Tipp 3: Ihre Ziffern kommen in der Reihenfolge von rechts nach links. Verwenden Sie reverse um die Reihenfolge der Liste zu ändern, wenn Sie das stört. Oder erstellen Sie die Liste mit insert(0,digit) .

Jetzt haben Sie die Ziffern. In einer Liste. Sie können durch die Liste iterieren.

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

Möglicherweise müssen Sie eine "multiple and add"-Schleife verwenden. total = total * new_base + next_digit ist die Art und Weise, wie der Körper der Schleife oft aussieht.

4voto

philosodad Punkte 1798

Nur ein Student, verlangsamen Sie mit der Idee, was Sie brauchen. Vielleicht brauchen Sie nicht das, was Sie zu brauchen glauben.

Beginnen Sie am Anfang: Der Benutzer gibt eine Zahl ein. Der Benutzer gibt eine Basis ein. Dies sind beides Strings. Nehmen wir an, die Basis ist 12, und die Zahl ist 1AB3. Sie haben also eine '1' an der 12^3-Stelle, ein 'A' an der 12^2-Stelle, ein 'B' in 12^1 und eine '3' an der 12^0-Stelle (Einsen). Wenn du diese Zahl zur Basis 10 haben willst, musst du einige Zahlen addieren.

Genauer gesagt, müssen Sie 1*12^3 + 10*12^2 + 11*12^1 + 3*12^0 addieren. Beachten Sie hier etwas: Sie haben 3,2,1,0. Das entspricht genau der LÄNGE der Eingabezeichenfolge 1AB3. Also wahrscheinlich ein for Schleife wäre hier hilfreich. Der Benutzer gibt keine ganze Zahl, sondern eine Zeichenkette ein. Sie benötigen also die Zeichen aus der Zeichenfolge, nicht die Ziffern der Zahl.

Woher wissen Sie, was die Symbole "A" und "C" in der Dezimaldarstellung bedeuten? Schau dir die Antwort von Noctis Skytower an!

Ihre erste Aufgabe besteht also darin, herauszufinden, wie man durch eine Zeichenkette ITERATE THROUGH macht. Ihre zweite Aufgabe besteht darin, herauszufinden, wie Sie die einzelnen Zeichenwerte aus Ihrer Zeichenkette verwenden können, um auf das Wörterbuch in der Antwort von Noctis Skytower zuzugreifen, und Ihre dritte Aufgabe besteht darin, herauszufinden, wie Sie eine Schleife schreiben können, die diese Informationen ausnutzt.

2voto

Dave Paquette Punkte 3

Sie brauchen nur ein einfaches Programm, das die Werte einliest und dann diese Funktion aufruft, um zwischen den Basen zu wechseln. Unter der Voraussetzung, dass die fraglichen Basen mit dem lateinischen Alphabet geschrieben werden können, d.h. Basis <= 36, gibt diese Funktion die Zahl in der neuen Basis als String zurück.

Es verwendet die eingebaute int Funktion, um die Basis 10 für die Umrechnung zu erhalten. Wenn Sie also keine eingebauten Funktionen verwenden sollen, müssen Sie diesen Teil selbst erledigen.

def changebase(n, base=10, to=10):
    '''
    params:
      n     - number to convert
      base  - current base of number 'n'
      to    - desired base, must be <= 36
    '''
    # check that new base is <= 36
    if to > 36 or base > 36:
        raise ValueError('max base is 36')

    # convert to base 10
    n = int(str(n), base)
    positive = n >= 0

    # return if base 10 is desired
    if to == 10:
        return str(n)

    # convert to new base
    n = abs(n)
    num = []
    handle_digit = lambda n: str(n) if n < 10 else chr(n + 55)
    while n > 0:
        num.insert(0, handle_digit(n % to))
        n = n // to

    # return string value of n in new base
    return ''.join(num) if positive else '-' + ''.join(num)

0voto

Chris Jester-Young Punkte 212385

Sie müssen zwei Funktionen schreiben. In Scheme (da ich Scheme viel besser kenne als Python :-P), heißen diese beiden Funktionen string->number y number->string Natürlich können Sie sie benennen, wie Sie wollen.

Jede dieser Funktionen benötigt einen Basisparameter, um die Konvertierung vorzunehmen. Wenn Sie möchten, können Sie den Wert auf 10 setzen.

Wenn Sie jedes dieser Elemente erfolgreich umgesetzt haben, ist der Rest ein Kinderspiel.

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'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X