Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
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())
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)