Работа с системами счисления
Перевод в десятичную
Перевод числа в десятичную систему счисления из любой другой в python осуществляется с помощью функции int в которую в качестве первого аргумента передается строковое представление числа, которое нужно перевести, а в качестве второго аргумента - число соответствующее основанию системы счисления из которой происходит перевод.
print(int("245F",16)) #На экран будет напечатано 9311
Перевод из десятичной в любую другую
Код, реализующий алгоритм перевода числа из десятичной системы в любую другую (в данном случае только до десятичной системы счисления включительно) выглядит следующим образом.
x=17 #Число, которое переводим y=2 #Система счисления в которую переводим res="" #Итоговый результат while x>=y: #Пока число x не меньше чем основание системы #счисления y в которую происходит перевод
res=str(x%y)+res #Дописываем остаток от деления числа
#x на число y в начало итогового числа
x//=y #Целочисленно делим x на y и записываем
#результат в переменную x
res=str(x)+res #Дописываем текущее значение числа x в
#начало переменной res
print(res) #Выводим получившийся результат на экран
Т.к. остаток от деления меньшего числа на большее равен меньшему числу, а результат целочисленного деления меньшего числа на большее равен нулю, мы можем опустить последний шаг, исправив условие в цикле "while" на x>0.
x=17 #Число, которое переводим y=2 #Система счисления в которую переводим res="" #Итоговый результат while x>0: #Пока число x больше нуля res=str(x%y)+res #Дописываем остаток от деления числа #x на число y в начало итогового числа x//=y #Целочисленно делим x на y и записываем #результат в переменную x print(res) #Выводим получившийся результат на экран
Код выше позволяет перевести в системы счисления только до десятичной. Довольно очевидно, что если мы получим в какой-то момент остаток больше 9, то мы вместо соответствующей буквы допишем двузначное число в переменную res. Чтобы этого избежать можно создать строку, где значение остатка от деления будет соответствовать индексу, а его представление в конкретной системе счисления - символу.
x=1765 #Число, которое переводим y=19 #Система счисления в которую переводим alph="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" #Строка, где индекс каждой цифры #соответствует ее представлению в #различных системах счисления res="" #Итоговый результат while x>0: #Пока число x больше нуля res=alph[x%y]+res #Дописываем цифру соответствующую остатку от деления #числа x на число y в начало итогового числа x//=y #Целочисленно делим x на y и записываем #результат в переменную x print(res) #Выводим получившийся результат на экран
Чаще всего мы будем работать с функцией перевода. Обернём алгоритм описанный выше в такую функцию.
def xtoy(x,y):
alph="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" res="" while x>0: res=alph[x%y]+res x//=y return res
Работа с системами счисления большими 36
Т.к. для систем счисления превышающих 36 нет общепринятых обозначений для цифр, то представить в виде конечного набора цифр число содержащее, например, цифру 40 мы не сможем. Если всё-таки возникает необходимость поработать с полной записью такого числа, то мы можем создать список, где каждый элемент будет представлять из себя искомую цифру.
x=1765 #Число, которое переводим y=64 #Система счисления в которую переводим res=[] #Итоговый результат while x>0: #Пока число x больше нуля res.insert(0,x%y) #Добавляем остаток от деления #числа x на число y в начало списка x//=y #Целочисленно делим x на y и записываем #результат в переменную x print(res) #Выводим получившийся результат на экран
Ну и тогда обратный алгоритм будет выглядеть так.
numbers=[9,13,6,15] #Пусть есть число 9D6F16 res=0 #Переменная для суммирования результата for i in range(len(numbers)): #Переберем все цифры, начиная со старшей pow=len(numbers)-i-1 #Посчитаем степень в которую возведем основание res+=numbers[i]*16**pow #Добавим в общую сумму очередной слагаемое print(res) #Выводим получившийся результат на экран
Пример нахождения отдельных характеристик
Если же нас не интересует само число, а интересуют какие-то его отдельные характеристики (самые частые задачи - это количество или сумма определенных цифр), то переводить его целиком никакой надобности нет. Так, например, мы можем решить задачу нахождения суммы всех цифр кратных k.
x=1765 #Число, которое переводим y=64 #Система счисления в которую переводим k=5 #Значение которому должны быть кратны цифры res=0 #Итоговый результат while x>0: #Пока число x больше нуля c=x%y #Получаем очередную цифру числа x #в системе счисления с основанием y if(c%k==0):#Если текущая цифра кратна k res+=x%y #То добавляем ее в общую сумму x//=y #Целочисленно делим x на y и записываем #результат в переменную x print(res) #Выводим получившийся результат на экран
Аналогично можем ввести счетчик и искать количество цифр подходящих под некоторое условие.