Python
Как перевести число в троичную систему счисления в Python
В Python нет встроенной функции вроде bin() или hex() именно для троичной системы. Поэтому перевод в основание 3 обычно пишут вручную: делят число на 3, записывают остаток, продолжают делить частное и в конце переворачивают собранные цифры
Это классическая учебная задача. Она полезна не только для троичной системы, но и для понимания любой системы счисления: двоичной, восьмеричной, шестнадцатеричной и произвольной до основания 36
Короткий ответ
def to_base3(number):
if number == 0:
return "0"
digits = []
while number > 0:
digits.append(str(number % 3))
number //= 3
return "".join(reversed(digits))
print(to_base3(10))
print(to_base3(27))
print(to_base3(100))
Результат
101
1000
10201
Как работает алгоритм
Возьмем число 10. Делим его на 3 и смотрим остатки
10 / 3 = 3, остаток 1
3 / 3 = 1, остаток 0
1 / 3 = 0, остаток 1
Остатки получились в обратном порядке: 1, 0, 1. Если прочитать их снизу вверх, получится 101. Это и есть число 10 в троичной системе
Почему используется % и //
Оператор % возвращает остаток от деления
print(10 % 3)
Результат
1
Оператор // возвращает целую часть от деления
print(10 // 3)
Результат
3
В переводе систем счисления они работают вместе: % 3 дает очередную троичную цифру, а // 3 уменьшает число для следующего шага
Версия с отрицательными числами
Если нужно поддержать отрицательные числа, можно отдельно запомнить знак
def to_base3(number):
if number == 0:
return "0"
sign = ""
if number < 0:
sign = "-"
number = abs(number)
digits = []
while number > 0:
digits.append(str(number % 3))
number //= 3
return sign + "".join(reversed(digits))
print(to_base3(-10))
print(to_base3(0))
print(to_base3(10))
Результат
-101
0
101
Ноль обрабатывается отдельно, потому что цикл while number > 0 для нуля не выполнится ни разу
Как проверить результат обратно
Чтобы убедиться, что перевод правильный, можно использовать int(text, 3). Второй аргумент функции int() означает основание системы счисления
ternary = "10201"
number = int(ternary, 3)
print(number)
Результат
100
Это удобная проверка для учебных задач: вы пишете свою функцию перевода в троичную систему, а потом проверяете результат встроенной функцией обратного преобразования
Универсальная функция для любой системы до 10
Если вы поняли троичную систему, можно сделать функцию для любого основания от 2 до 10
def to_base(number, base):
if base < 2 or base > 10:
raise ValueError("Основание должно быть от 2 до 10")
if number == 0:
return "0"
sign = ""
if number < 0:
sign = "-"
number = abs(number)
digits = []
while number > 0:
digits.append(str(number % base))
number //= base
return sign + "".join(reversed(digits))
print(to_base(10, 2))
print(to_base(10, 3))
print(to_base(10, 8))
Результат
1010
101
12
Для оснований выше 10 понадобятся буквы, потому что цифры после 9 уже не существуют как отдельные десятичные символы
Частые ошибки
Первая ошибка — забыть перевернуть остатки. Если для числа 10 собрать остатки как есть, получится 101, и случайно это совпадет. Но для других чисел ошибка быстро проявится
print(to_base3(5))
Правильный результат для 5 — 12, потому что 5 = 1 * 3 + 2
Вторая ошибка — использовать обычное деление / вместо целочисленного //. Обычное деление дает дробное число, а в алгоритме нужно именно целое частное
Третья ошибка — не обработать ноль. Без отдельной проверки функция вернет пустую строку
Мини-практика
Напишите программу, которая просит число у пользователя и выводит его в троичной системе
def to_base3(number):
if number == 0:
return "0"
digits = []
while number > 0:
digits.append(str(number % 3))
number //= 3
return "".join(reversed(digits))
number = int(input("Введите число: "))
print("В троичной системе:", to_base3(number))
После этого проверьте несколько чисел через int(result, 3). Это даст уверенность, что функция работает не только на одном примере
Что почитать дальше по Python
Если нужен общий маршрут по теме, откройте рубрику Python. Для соседних задач пригодятся эти разборы:
- Как округлить число в Питоне до целого: round, int, floor и ceil
- Как округлить число до сотых в Python: round, форматирование и Decimal
- Как перевернуть число в Python: через строку и через математику
- Как преобразовать число в строку Python: str, f-строки и форматирование