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())