Python - домашнее задание - преобразование любой базы на любую базу

StackOverflow https://stackoverflow.com/questions/3973685

  •  09-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь сделать программу для преобразования номера в любой базе на другую базу выбора пользователя. Код у меня так далеко идет так:

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

Это данные, которые я получаю от пользователя. Начальное число, его исходное основание и базовое пользователь хочет преобразовать. Насколько я понимаю, мне нужно преобразовать в базу 10, а затем на нужную базу, указанную пользователем.

Именно здесь я ударяю кирпичную стену: мне нужно умножить на первую левую цифру в исходном номере на его исходную базу, а затем добавить следующую цифру справа, а затем повторить, пока я не ударю всю правую цифру. Я понимаю, как это сделать на бумаге, но я понятия не имею, как положить его в код Python. Я не уверен, как я умножу на первое число, а затем добавьте следующий, и я не понимаю, как позволить программе знать, когда прекратить выполнение этой операции.

Я не прошу просим программу написано для меня, но я хотел бы быть указан в правильном направлении.

Спасибо за ваше время!

Это было полезно?

Решение

Это должно быть первой половиной ответа на вашу проблему. Можете ли вы понять, как преобразовать в базу?

# 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

Вот вторая половина решения. Используя эти две функции, конвертирование оснований очень легко сделать.

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

После того, как все вместе вы должны закончиться с программой ниже. Пожалуйста, найдите время, чтобы понять это!

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

Другие советы

Мне нужно умножить на самую левую цифру в исходном номере на его зрелище, а затем добавить следующую цифру справа, а затем повторить, пока не ударю всю правую цифру.

Так что вам нужно получить цифры. В списке.

Подсказка 1: использовать divmod() функция, чтобы сломать номер в цифры. Разделите на 10, чтобы получить десятичные цифры.

Подсказка 2: пока N. > 0: вы можете использовать divmod() чтобы получить кого-то и остаток. Если вы сохраняете остаток в списке, и используйте фактор как новое значение N. Ваш номер становится меньше, пока не осталось равно нулю, и вы закончите.

Подсказка 3: Ваши цифры прибывают в правый на левый порядок. Использовать reverse Чтобы переключить заказ списка этого, беспокоит вас. Или создать список, используя insert(0,digit).

Теперь, когда у вас есть цифры. В списке. Вы можете перейти через список.

Попробуйте for Заявление на размере.

Вам может потребоваться использовать цикл «несколько и добавить». total = total * new_base + next_digit Является ли способ выглядит тело петли.

Просто студент, замедляйся идеей того, что вам нужно. Возможно, вам не понадобится то, что вы думаете, вам нужно.

Начните в начале: пользователь вводит номер. Пользователь вводит базу. Это оба строки. Скажите, что база 12, и число 1ab3. Таким образом, у вас есть «1» в 12-м месте, «А» в 12 ^ 2 месте, A 'B' в 12 ^ 1, а «3» в 12 ^ 0 (одних) месте. Если вы хотите это число в базе 10, вам нужно добавить несколько номеров вместе.

В частности, вам нужно добавить 1 * 12 ^ 3 + 10 * 12 ^ 2 + 11 * 12 ^ 1 + 3 * 12 ^ 0. Обратите внимание на что-то здесь: у вас есть 3,2,1,0. Что хорошо соответствует длине входной строки 1ab3. Так, наверное а for петля будет полезно здесь. Пользователь не вводит целое число, они вводят строку. Таким образом, вам нужны персонажи из строки, а не цифры из числа.

Откуда вы знаете, какие символы «A» и «C» представляют собой десятичную нотацию? Посмотрите на ответ от Noctis Skytower!

Таким образом, ваша первая задача состоит в том, чтобы выяснить, как повторить через строку. Ваша вторая задача - выяснить, как использовать отдельных значений символов из вашей строки для доступа к словарю ответа Noctis Skytower, а ваша третья задача - значит выяснить, как написать петлю, которая использует эту информацию.

Вам нужно написать две функции. В схеме (так как я знаю схему намного лучше, чем Python :-P), эти две функции называются string->number и number->string, Хотя, конечно, вы можете назвать их все, что вам нравится.

Каждая из этих функций должна принять базовый параметр, чтобы выполнить преобразование. Вы можете сделать его по умолчанию до 10, если хотите.

Как только вы реализуете каждый из тех успешных, остальное является куском пирога.

Тестовые случаи для вас:

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() Можно конвертировать строки с любой базы от 2 до 36. Если вам нужен более широкий ассортимент, чем то, создайте строку, содержащую цифры и используйте index() способ получить значение.

Я пришел сюда искал ярлыки, но выглядит как никто не существует. Так вот длинные методы, которые я нашел. Этот ответ основан на ответе на Quora. А также связан с другими ответами здесь.

Самый простой способ (вероятно) - это преобразовать любое число из базового b1 до b2 - это преобразование b1 → десятичное → b2.

Номер в базе B1 можно обрабатывать как полиномиал в основании B1,

IE 4-значный номер ABCD = D * (B1 ^ 0) + C * (B1 ^ 1) + B * (B1 ^ 2) + A * (B1 ^ 3)

Например, 123 (десятичная) = 3 * (10 ^ 0) + 2 * (10 ^ 1) + 1 * (10 ^ 2)

Итак, чтобы преобразовать из любой базы до десятичной работы, найдите сумму всех [digit*(base^power)] (Где мощность 0 к [NumoFDigits-1]) в обратном порядке цифр. Для этого лечить номер как string и итерации через это, используя for петля.

Итак, вход должен быть string и опера int.

Следующим шагом является преобразование десятичного числа D до базы B2.

Разделить D / B2, остаток является самой правой цифрой. Разделите Cient By B2, остаток на этот раз является следующей правой цифрой. Повторите этот цикл, пока фактор не будет 0.

Например.,

8 (декабрь) в двоичный:

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 (декабря) = 1000 (bin)

Это делается путем обработки номера выходного выхода в виде строки, и отменив строку после объединения всех цифр. (См. Выше: '0' + '0' + '0' + '1' ='0001' обратный его 🠢 '1000'

Для этих двух процессов следующая программа Python будет делать:

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

Но вы заметите, что эта программа не практична при использовании баз более 10. Для этой цели необходимо использовать больше цифр для представления значений более 0-9. Для этого вам придется использовать долго if-else Ladders для выбора цифр в соответствии со значением лица или видами вершины.

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

Почти все избегают этого долгих if-else Лестница, используя словарь с значениями лица в качестве клавиш и символы / цифры в качестве соответствующих значений. Теперь программа становится:

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

🠅🠅🠅🠅🠅 Ваше домашнее задание. Выберите любой на три метода.

Чтобы использовать еще больше баз, вы можете просто расширить словарь и создать длинный как @Noctis Skytower.

Каждый веб-сайт, который я проверил, имел такие длинные словари, но я склонен использовать ярлыки практически для всего. Я использовал простой range() функция, if-else заявления и просто for петли, чтобы сократить процесс (но я думаю, что это выглядит немного запутанному, несмотря на простой). Преимущество этого состоит в том, что очень легко добавить больше баз, просто добавив ключ, range(a,b), для диапазона личных значений цифр и значение, range(x,y), для диапазона значений Unicode символов для соответствующих значений.

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

Это также может быть сделано с использованием функций:

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

Теперь, если вы можете расширить словарь, вы, вероятно, можете преобразовать из Любые база Любые основание. 😎.

Это некоторые ярлыки, которые я нашел на других QA Stackoverflow и других веб-сайтов:

Чтобы преобразовать число от любой базы от 2 до 36 до десятичных: 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

Для преобразования десятичных случаев в двоичные, восьмеричные и шестнадцатеричные:

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

Надеюсь этому TL;DR помог кому-то. Если кто-то может указать на любые ошибки, редактируйте это или предоставьте более короткие методы, я буду благодарен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top