#python
Python как написать функцию перевода из k-ичной системы в десятичную?
Ответы
Ответ 1
Элементарно, используя стандартную функцию int() numberstr='22h' print (int(numberstr, 30)) Единственное ограничение: основание может быть от 2 до 36. Если нужна другая база, надо писать самому. Это другой разговор.Ответ 2
Решение для основания 36 с помощью reduce (python2): str = '1zz'; res=reduce(lambda x,y:x*36+('0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'.find(y)), str.strip().upper(),0) print res; # 2591Ответ 3
int в CPython не хранится в десятичной системе: >>> import sys >>> sys.int_info sys.int_info(bits_per_digit=30, sizeof_digit=4) print(some_number) вызывает str(int) функцию, которая и преобразует int в строку, содержащую десятичные цифры (это не бесплатная операция—она может занимать долгое время для больших чисел). Будем считать, что задача в вопросе: преобразовать строку kstr, содержащую натуральное число в к-ичной системе исчисления в Python int объект. Если нельзя использовать int(kstr, base) напрямую (основание больше 36, цифры нестандартные, то легко в цикле собрать из отдельных цифр соответствующее число. К примеру, аналог 1003 = 910: >>> from functools import reduce >>> reduce(lambda n, d: n * 3 + d, map("012".index, "100")) 9 >>> int("100", 3) 9 Если цифры abc, а не 012 то есть для baa3 = 910: >>> reduce(lambda n, d: n * 3 + d, map("abc".index, "baa")) 9 Вот более подробно о том как reduce() функция последовательность цифр в число превращает (для основания 10). Можно написать функцию, которая автоматически генерирует функцию преобразования (converter) по заданным цифрам системы счисления: from functools import reduce def make_converter_int_from_base_k(digits): """Return int(kstr, len(digits)) analog for any digits.""" if not digits: raise ValueError('no digits') k = len(digits) basek2digit = {d:i for i, d in enumerate(digits)}.__getitem__ def converter(kstr): if not (set(kstr) <= set(digits)) or not kstr: raise ValueError('invalid literal for int with digits {digits!r}: {kstr!r}') return reduce(lambda number, digit: number*k + digit, map(basek2digit, kstr)) return converter Пример: >>> base3 = make_converter_int_from_base_k('abc') >>> base3('c') 2 >>> base3('ba') 3 >>> base3('baa') 9 Пример из Википедия как число, представляющее Man в ASCII, можно в основание 64 преобразовать (507121410 = 4d616e16 = TWFu64): >>> import base64 >>> import string >>> int.from_bytes(b'Man', 'big') 5071214 >>> base64.b64encode(b'Man') b'TWFu' >>> base64digits = string.ascii_uppercase + string.ascii_lowercase + string.digits + '+/' >>> base64decode = make_converter_int_from_base_k(base64digits) >>> base64decode('TWFu').to_bytes(3, 'big') b'Man' Если известны ограничения на вводимые числа, то можно попробовать угадать систему счисления по самому числу, не задавая digits явно. При преобразовании между некоторыми парами систем исчисления, иногда достаточно только строковых замен без промежуточного преобразования в int. К примеру из 16-ной в 2-ную (hex2bin()), из 2-ной в 8-ную (bin2oct()). Стоит заметить, что int в CPython не хранится в десятичной системе (sys.int_info). print вызывает str(int) функцию, которая и преобразует int в строку, содержащую десятичные цифры (это не бесплатная операция—она может занимать долгое время для больших чисел).Ответ 4
Думаю, что в таком мощном Пайтоне, всё таки есть нужная функция. Полистайте мануал. Если что, смотрите в преобразования методом Горнера. Вот JS, надеюсь вы сможете перевести её в Python: function 2dec ( str, base ) { base = (!base)? 2:Number(base); str = str.split(''); var s = 0; for( var k in str ) { s = (base*s + (str[k]-0)); } return s; }
Комментариев нет:
Отправить комментарий