Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Общие вопросы > Функция, которая конвектирует


Автор: Igor2012 3.3.2015, 16:47
Помогите разработать функцию convert_n_to_m(x, n, m),
которая принимает 3 аргумента -- целое число (в системе счисления с основанием n) или строку x, которая представляет такое число, и целые числа n и m (1 <= n, m <= 36),
и возвращает строку -- представление числа х в системе счисления m.

В случае, если аргумент х не является числом или строкой, или не может быть представлением неотъемлемого целого числа в системе счисления с основанием n, вернуть логическую константу False.

В системах счисления с основанием больше десяти для обозначения разрядов со значением больше 9 использовать буквы латинского алфавита в верхнем регистре от A до Z.

Считать, что в единичной системе счисления число записывается соответствующим количеством нулей.

Например
Вызов функции: convert_n_to_m([123], 4, 3)
Возвращает: False
Вызов функции: convert_n_to_m("0123", 5, 6)
Возвращает: 102
Вызов функции: convert_n_to_m("123", 3, 5)
Возвращает: False
Вызов функции: convert_n_to_m(123, 4, 1)
Возвращает: 000000000000000000000000000
Вызов функции: convert_n_to_m(-123.0, 11, 16)
Возвращает: False
Вызов функции: convert_n_to_m("A1Z", 36, 16)
Возвращает: 32E7
Я начал изучать Python. Вот застрял на этой задаче. Помогите, кто разбирается в Python. Заранее спасибо.

Автор: baldman88 4.3.2015, 16:49
Ну так хоть покажите до чего Вы дошли. Иначе Вам в раздел "Центр помощи".
И, если не секрет, откуда это задание?

Автор: Romikgy 4.3.2015, 20:52
Код

def baseN(num,b,numerals="0123456789abcdefghijklmnopqrstuvwxyz"):
    return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b])

def convert_n_to_m(x,n,m):
    if n<1: return False
    if m<1 or m>36: return False
    if type(x)==type(0):
        #numeric
        if m==1:
            d='%d'%x
            try:
                d=int(d,n)
                return '0'*d
            except:
                return False
        else:
            return baseN(x,n).upper()
    elif type(x)==type(''):
        #string
        if m==1:
            try:
                d=int(x,n)
                return '0'*d
            except:
                return False
        else:
            try:
                q=int(x,n)
                return baseN(q,m).upper()
            except:
                return False
    else:
        return False

Автор: baldman88 5.3.2015, 16:45
Монструозный вариант, зато одной функцией  smile 
Код

def convert_n_to_m(x, n, m):
    symbols = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    if (((type(x) != str) and (type(x) != int)) or (n < 1) or (n > 36) or (m < 1) or (m > 36)):
        return False
    else:
        if (type(x) == int):
            x = str(x)
        if (False in map(lambda symbol: True if (symbol in symbols[0 : n]) else False, x)):
            return False
        else:
            value = len(x) if (n == 1) else int(x, n)
            result = ""
            if (m > 1):
                while (value > 0):
                    result += str(symbols[value % m])
                    value /=  m
            else:
                result = '0' * value
            return result[ : : -1]

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)