CCCPaste

140e04d7582fe

def task5_native():
    """нативное решение с использованием встроенной длинной алгебры Python"""
    with open('input.txt', 'r', encoding='utf-8') as f:
        num_1 = int(f.readline().strip())  # читаем первое число
        oper = f.readline().strip()  # читаем операцию
        num_2 = int(f.readline().strip())  # читаем второе число
        if oper == '-':
            res = num_1 - num_2  # выполняем вычитание
        else:
            res = num_1 + num_2  # выполняем сложение

        return res


def parse_number_with_sign(num_str):
    num_str = num_str.strip()  # убираем пробельные символы
    if num_str.startswith('-'):
        # убираем минус и все ведущие нули
        abs_val = num_str[1:].lstrip('0') or '0'  # получаем модуль числа
        return '-', abs_val  # возвращаем знак и модуль
    else:
        # убираем все ведущие нули
        abs_val = num_str.lstrip('0') or '0'  # получаем модуль числа
        return '+', abs_val  # возвращаем знак и модуль


def is_greater_or_equal(num1_str, num2_str):
    if len(num1_str) > len(num2_str): return True  # сравниваем по длине
    if len(num1_str) < len(num2_str): return False  # сравниваем по длине
    return num1_str >= num2_str  # сравниваем лексикографически


def subtract_core(larger_str, smaller_str):
    n1 = [int(c) for c in larger_str[::-1]]  # преобразуем большее число в список цифр
    n2 = [int(c) for c in smaller_str[::-1]]  # преобразуем меньшее число в список цифр

    result = []  # список для результата
    borrow = 0  # заем для вычитания

    for i in range(len(n1)):
        digit1 = n1[i]  # берем цифру из большего числа
        digit2 = n2[i] if i < len(n2) else 0  # берем цифру из меньшего или 0

        diff = digit1 - digit2 - borrow  # вычисляем разность

        if diff < 0:
            result.append(diff + 10)  # добавляем результат с учетом займа
            borrow = 1  # устанавливаем заем
        else:
            result.append(diff)  # добавляем разность
            borrow = 0  # сбрасываем заем

    # удаление ведущих нулей
    while len(result) > 1 and result[-1] == 0:
        result.pop()  # убираем ведущий ноль

    return "".join(map(str, result[::-1]))  # возвращаем строку результата


def add_core(num1_str, num2_str):
    num1 = [int(dig) for dig in num1_str[::-1]]  # преобразуем первое число в список цифр
    num2 = [int(dig) for dig in num2_str[::-1]]  # преобразуем второе число в список цифр

    res_len = max(len(num1), len(num2))  # определяем длину результата
    res = []  # список для результата
    carry = 0  # перенос для сложения

    for i in range(res_len):
        dig1 = num1[i] if i < len(num1) else 0  # берем цифру или 0
        dig2 = num2[i] if i < len(num2) else 0  # берем цифру или 0

        cur_sum = dig1 + dig2 + carry  # вычисляем сумму

        res.append(cur_sum % 10)  # добавляем младшую цифру
        carry = cur_sum // 10  # вычисляем перенос

    if carry > 0:
        res.append(carry)  # добавляем перенос, если он есть

    return "".join(map(str, res[::-1]))  # возвращаем строку результата


def task5_manual():
    with open('input.txt', 'r', encoding='utf-8') as f:
        num_1_raw = f.readline().strip()  # читаем первое число
        oper = f.readline().strip()  # читаем операцию
        num_2_raw = f.readline().strip()  # читаем второе число

    # парсинг и форматирование
    sign1, abs1 = parse_number_with_sign(num_1_raw)  # получаем знак и модуль первого числа
    sign2, abs2 = parse_number_with_sign(num_2_raw)  # получаем знак и модуль второго числа

    # инвертирование знака второго числа, если вычитание
    if oper == '-':
        sign2 = '+' if sign2 == '-' else '-'  # меняем знак второго числа

    # выбор базовой операции
    if sign1 == sign2:
        # если знаки одинаковые (A+B или -A-B), то складываем модули
        result_abs = add_core(abs1, abs2)  # складываем модули
        final_result_sign = sign1  # знак результата совпадает с исходным

    else:
        # если знаки разные (A-B или -A+B), то вычитаем модули
        # определяем порядок: большее - меньшее
        if is_greater_or_equal(abs1, abs2):
            larger = abs1  # выбираем большее число
            smaller = abs2  # выбираем меньшее число
            final_result_sign = sign1  # знак большего числа
        else:
            larger = abs2  # выбираем большее число
            smaller = abs1  # выбираем меньшее число
            final_result_sign = sign2  # знак большего числа

        result_abs = subtract_core(larger, smaller)  # вычитаем модули

    # форматирование результата
    if result_abs == "0":
        return "0"  # возвращаем 0, если результат ноль
    elif final_result_sign == '-':
        return '-' + result_abs  # добавляем минус, если результат отрицательный
    else:
        return result_abs  # возвращаем положительный результат


if __name__ == '__main__':
    print(task5_manual())