Троичная система счисления: перевод чисел в Python

Раздел: Основы Python -> Перевод систем счисления

Способы перевода десятичных чисел в троичную систему

В Python отсутствует встроенная функция для преобразования чисел в троичную систему, в отличие от bin(), oct() или hex(). Однако реализовать такой перевод можно несколькими способами. Ниже приведены основные варианты, каждый из которых решает конкретную задачу.

Наиболее эффективное решение - итеративный алгоритм с накоплением остатков от деления на 3. Он работает за O(log₃N) и не зависит от глубины рекурсии.

def to_ternary_iter(n):
    if n == 0:
        return '0'
    digits = []
    sign = ''
    if n < 0:
        sign = '-'
        n = -n
    while n > 0:
        digits.append(str(n % 3))
        n //= 3
    return sign + ''.join(reversed(digits))

Python восьмеричная система (восьмеричная система счисления в python)

Пояснение: на каждом шаге получается остаток от деления на 3 (цифра 0,1,2), который добавляется в список. После завершения цикла список переворачивается (остатки шли от младшего разряда к старшему) и соединяется в строку. Для отрицательных чисел сначала запоминается знак, а в конце добавляется минус.

Как использовать рекурсию для перевода в троичную систему?

def to_ternary_rec(n):
    if n < 0:
        return '-' + to_ternary_rec(-n)
    if n < 3:
        return str(n)
    return to_ternary_rec(n // 3) + str(n % 3)

перевод в другие системы счисления python (перевод в другую систему счисления в python)

Рекурсивный метод вызывает себя для целой части от деления, а остаток добавляется в конец строки. Базовый случай - число меньше 3.

Проблема: при больших значениях n глубина рекурсии может превысить лимит Python (обычно 1000 вызовов). Решение - увеличение лимита через sys.setrecursionlimit или переход к итеративному алгоритму.

Как организовать перевод с помощью списка как стека?

def to_ternary_stack(n):
    if n == 0:
        return '0'
    stack = []
    neg = n < 0
    if neg:
        n = -n
    while n:
        stack.append(str(n % 3))
        n //= 3
    result = ''.join(stack[::-1])
    return '-' + result if neg else result

16 система счисления python (перевод в шестнадцатеричную систему в python)

Список stack используется как стек: цифры добавляются в конец, затем извлекаются в обратном порядке срезом [::-1].

Как перевести отрицательное десятичное число?

def to_ternary_signed(n):
    if n < 0:
        return '-' + to_ternary_iter(-n)
    return to_ternary_iter(n)

Python перевод в двоичную систему (перевод числа в двоичную систему в python)

Знак сохраняется отдельно, перевод выполняется для модуля числа. Альтернативно можно использовать прямой код.

Как перевести дробное десятичное число?

def to_ternary_float(n, precision=6):
    integer_part = int(n)
    frac_part = n - integer_part
    int_str = to_ternary_iter(integer_part)
    frac_str = []
    for _ in range(precision):
        frac_part *= 3
        digit = int(frac_part)
        frac_str.append(str(digit))
        frac_part -= digit
    return int_str + '.' + ''.join(frac_str)

перевод в десятичную систему счисления python (перевод числа в десятичную систему счисления в python)

Дробная часть умножается на 3, целая часть извлечения - очередная троичная цифра. Параметр precision задаёт количество знаков после запятой.

Ошибка: при переводе дробных чисел может возникать периодическая дробь. Функция обрезает разряды, что приводит к погрешности. Для точного представления следует использовать специальные типы данных (например fractions.Fraction).

Как получить троичную строку заданной длины?

def to_ternary_padded(n, length=8):
    s = to_ternary_iter(n) if n >= 0 else '0'
    if n < 0:
        s = '-' + to_ternary_iter(-n)
    if len(s) >= length:
        return s
    if s.startswith('-'):
        return '-' + s[1:].rjust(length-1, '0')
    return s.rjust(length, '0')

Дополняет троичную запись нулями слева (или после знака) до нужной длины. Удобно для работы с цифровыми системами постоянной разрядности.

Расширенные примеры перевода в троичную систему

В этом разделе приведены примеры, демонстрирующие нестандартные случаи и комбинированные подходы.

Пример 1: Перевод очень больших чисел

Пример
def to_ternary_large(n):
    # n - целое произвольной длины (Python int)
    if n == 0:
        return '0'
    digits = []
    sign = ''
    if n < 0:
        sign = '-'
        n = -n
    while n:
        digits.append(str(n % 3))
        n //= 3
    return sign + ''.join(reversed(digits))

print(to_ternary_large(10**20))
print(to_ternary_large(-10**20))
1100011212122210100101020200
-1111011022021111101001201200

Пояснение: Python поддерживает целые числа неограниченной точности, поэтому алгоритм работает для любых размеров.

Пример 2: Обратный перевод из троичной строки в десятичную и проверка

Пример
def from_ternary(s):
    if s.startswith('-'):
        return -from_ternary(s[1:])
    if '.' in s:
        integer, fra = s.split('.')
        int_part = from_ternary(integer)
        frac_part = 0
        for i,ch in enumerate(fra, 1):
            frac_part += int(ch) * (3 ** (-i))
        return int_part + frac_part
    # целая часть
    total = 0
    for ch in s:
        total = total * 3 + int(ch)
    return total

test = [127, -64, 3.5, 0.1]
for v in test:
    t = to_ternary_float(v, 8) if isinstance(v, float) else to_ternary_iter(v)
    back = from_ternary(t)
    print(f"{v} -> {t} -> {back:.10f}" if isinstance(v, float) else f"{v} -> {t} -> {back}")
127 -> 11201 -> 127
-64 -> -2101 -> -64
3.5 -> 10.11111111 -> 3.49999999... (приближение)
0.1 -> 0.00220022 -> 0.09999999...

Пояснение: обратный перевод подтверждает корректность алгоритма. Для дробных чисел точность ограничена.

Пример 3: Перевод числа в троичный дополнительный код (для отрицательных)

Пример
def to_ternary_twos(n, bits=8):
    # Только для целых, представление с дополнением до 3^bits
    if n >= 3**bits // 2:
        raise ValueError("Число выходит за диапазон")
    if n >= 0:
        return to_ternary_padded(n, bits)
    # отрицательное: 3^bits - |n|, с дополнением до 2 цифр
    pos = to_ternary_iter(3**bits + n)  # n + 3^bits = 3^bits - |n|
    return pos.rjust(bits, '0')

print(to_ternary_twos(-1, 4))
print(to_ternary_twos(4, 4))
2222
0011

Пояснение: реализация дополнительного кода по основанию 3. Полезно для систем с фиксированной разрядностью.

Пример 4: Функциональный стиль с reduce и lambda

Пример
from functools import reduce

def to_ternary_reduce(n):
    if n < 0:
        return '-' + to_ternary_reduce(-n)
    if n == 0:
        return '0'
    # накапливаем цифры в списке
    def step(acc, x):
        acc.insert(0, str(x % 3))
        return (x // 3, acc)
    _, digits = reduce(lambda a, _: step(a[1], a[0]), range(n.bit_length()), (n, []))
    return ''.join(digits) if digits else '0'

print(to_ternary_reduce(42))
1120

Пояснение: используется reduce для имитации цикла, число итераций вычисляется через bit_length (заведомо больше требуемого). Неэффективно, но демонстрирует возможность функционального подхода.

Пример 5: Троичное представление вещественного числа с заданной точностью и округлением

Пример
def to_ternary_float_rounded(n, precision=6):
    # округление до precision знаков после запятой
    factor = 3 ** precision
    rounded = round(n * factor)
    int_part = rounded // factor
    frac_part = rounded % factor
    int_str = to_ternary_iter(int_part)
    # перевод дробной части
    frac_str = []
    for _ in range(precision):
        frac_part *= 3
        digit = frac_part // factor
        frac_str.append(str(digit))
        frac_part %= factor
    return int_str + '.' + ''.join(frac_str)

print(to_ternary_float_rounded(3.1415926535, 6))
10.010211

Пояснение: сначала число округляется до заданного количества троичных знаков, затем переводятся целая и дробная части отдельно.

Перевод числа в троичную систему в Python - comments

En
перевод в троичную систему python (python)