Перевод чисел в троичную систему счисления средствами Python
Введение
Перевод чисел в троичную систему счисления (основание 3) встречается в учебных задачах, теории чисел и некоторых криптографических алгоритмах. В Python отсутствует встроенная функция для прямого преобразования в троичную запись, но реализовать её можно несколькими способами. Ниже представлено основное эффективное решение, а затем альтернативные варианты для различных сценариев. Каждый вариант сопровождается вопросом, на который он отвечает, и пояснением возможных проблем.
Как перевести целое число в троичную систему с помощью последовательного деления на 3?
Стандартный алгоритм: число делится на основание (3), остаток становится цифрой младшего разряда, а частное снова делится до тех пор, пока не станет равным нулю. Для отрицательных чисел запоминается знак, а работа ведётся с модулем. Ноль обрабатывается отдельно.
def to_base3(n):
if n == 0:
return "0"
sign = "-" if n < 0 else ""
n = abs(n)
digits = []
while n > 0:
digits.append(str(n % 3))
n //= 3
return sign + ''.join(reversed(digits))
print(to_base3(10)) # 101
print(to_base3(-10)) # -101Python двоичная запись (двоичное представление чисел в python)
Как перевести число в троичную систему рекурсивно?
Рекурсия повторяет ту же логику деления, накапливая остатки при возврате из рекурсивных вызовов. Требуется обёртка для обработки нуля и знака.
def to_base3_rec(n):
if n == 0:
return ""
return to_base3_rec(n // 3) + str(n % 3)
def to_base3_rec_wrapper(n):
if n == 0:
return "0"
sign = "-" if n < 0 else ""
n = abs(n)
return sign + (to_base3_rec(n) or "0")
print(to_base3_rec_wrapper(10)) # 101как перевести число в троичную python (перевод числа в троичную систему счисления в python)
Как перевести дробное число в троичную систему?
Целая часть переводится любым целочисленным методом, дробная - последовательным умножением на 3 с выделением целой части. Точность ограничивается заданным числом знаков после запятой.
def fractional_to_base3(frac, precision=10):
res = []
for _ in range(precision):
frac *= 3
digit = int(frac)
res.append(str(digit))
frac -= digit
return ''.join(res)
def to_base3_float(num, precision=10):
integer_part = int(num)
fraction_part = num - integer_part
integer_str = to_base3(integer_part) # используем ранее определённую функцию
frac_str = fractional_to_base3(fraction_part, precision)
return integer_str + "." + frac_str
print(to_base3_float(3.14159, 6)) # 10.010122Python перевод в десятичную (перевод в десятичную систему python)
Как перевести число в троичную систему, используя встроенную функцию int() для обратного преобразования?
Хотя int() с основанием 3 позволяет прочитать троичную строку, для прямого перевода можно написать компактный вариант с циклом. Этот же приём удобно использовать для проверки корректности.
def to_base3_compact(n):
if n == 0:
return "0"
sign = "-" if n < 0 else ""
n = abs(n)
digits = []
while n:
digits += [str(n % 3)]
n //= 3
return sign + ''.join(digits[::-1])
# Проверка обратным преобразованием
print(int(to_base3_compact(10), 3) == 10) # TrueВыбор метода зависит от конкретной задачи: для быстрого перевода целых чисел подходит цикл; для учебных целей - рекурсия; для работы с дробями - отдельный алгоритм с заданной точностью. Во всех случаях следует учитывать обработку нуля и знака.
Расширенные примеры и нестандартные случаи
Обратное преобразование из троичной строки в десятичное число
Встроенная функция int() с указанием основания позволяет легко выполнить обратное преобразование. Это полезно для проверки корректности перевода.
def from_base3(s):
return int(s, 3)
print(from_base3("101")) # 1010
Применение функции map для списка чисел
Если необходимо перевести несколько чисел в троичную запись, удобно использовать map с ранее определённой функцией.
nums = [0, 1, 5, 10, 27, 100]
base3_list = list(map(to_base3, nums))
print(base3_list)['0', '1', '12', '101', '1000', '10201']
Перевод очень больших чисел (например, 10^18)
Алгоритм с циклом работает эффективно для сколь угодно больших чисел, поддерживаемых типом int в Python (неограниченная точность).
big_num = 12345678901234567890
result = to_base3(big_num)
print("Троичная запись:", result)
print("Обратная проверка:", from_base3(result) == big_num)Троичная запись: 10202220210111021210001211210212211020 Обратная проверка: True
Перевод дробного числа 0.1 в троичную систему с высокой точностью
Пример показывает, как дробь 0.1 представляется в троичной системе (периодическая дробь).
def to_base3_fraction(frac, precision=20):
res = []
for i in range(precision):
frac *= 3
d = int(frac)
res.append(str(d))
frac -= d
return ''.join(res)
print("0.1 в троичной:", "0." + to_base3_fraction(0.1, 20))0.1 в троичной: 0.00220022002200220022
Рекурсивный перевод с обработкой знака внутри одной функции
Можно объединить обработку нуля и знака непосредственно в рекурсивной функции, избегая отдельной обёртки.
def to_base3_rec_self(n):
if n == 0:
return "0"
if n < 0:
return "-" + to_base3_rec_self(-n)
return to_base3_rec_self(n // 3) + str(n % 3)
print(to_base3_rec_self(-10)) # -101
print(to_base3_rec_self(0)) # 0-101 0
Таблица перевода чисел от 0 до 20
Генерация и вывод в удобном формате для демонстрации.
for i in range(21):
print(f"{i:3d} -> {to_base3(i)}")0 -> 0 1 -> 1 2 -> 2 3 -> 10 4 -> 11 5 -> 12 6 -> 20 7 -> 21 8 -> 22 9 -> 100 10 -> 101 11 -> 102 12 -> 110 13 -> 111 14 -> 112 15 -> 120 16 -> 121 17 -> 122 18 -> 200 19 -> 201 20 -> 202
Проверка корректности результатов с помощью f-строк и set
Можно автоматизировать проверку для диапазона чисел.
errors = []
for n in range(-100, 101):
s = to_base3(n)
if from_base3(s) != n:
errors.append((n, s))
print("Ошибки:", errors if errors else "нет")Ошибки: нет