Python - домашнее задание - преобразование любой базы в любую базу - PullRequest
4 голосов
/ 20 октября 2010

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

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.Я не уверен, как мне умножить первое число, а затем добавить следующее, и при этом я не понимаю, как сообщить программе, когда прекратить выполнение этой операции.

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

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

Ответы [ 5 ]

7 голосов
/ 20 октября 2010

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

# 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
5 голосов
/ 20 октября 2010

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

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

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

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

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

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

Попробуйте оператор for для размера.

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

2 голосов
/ 20 октября 2010

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

Начните с самого начала: пользователь вводит число.Пользователь вводит базу.Это обе строки.Скажем, основание 12, а число 1AB3.Таким образом, у вас есть «1» в 12 ^ 3 месте, «А» в 12 ^ 2 месте, «В» в 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's, а ваша третья задача - выяснить, как написать цикл, использующий эту информацию.

0 голосов
/ 20 октября 2010

int() может преобразовывать строки из любой базы от 2 до 36. Если вам нужен более широкий диапазон, чем этот, то создайте строку, содержащую цифры, и используйте index() метод получения значения.

0 голосов
/ 20 октября 2010

Вам нужно написать две функции. В Scheme (поскольку я знаю Scheme гораздо лучше, чем 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...