def is_valid_number(number: str) -> bool: """ Набор символов считается корректным числом, если: 1) Это последовательность цифр (`number.isdigit()`) 2) При конвертировании числа туда и обратно получится тот же результат (`number == oct(int(number, 8))[2:]`) Способ топорный, но не будем заострять на этом внимание. Проверка аргументов, вероятно, не является обязательной частью программы. """ return number.isdigit() and number == oct(int(number, 8))[2:] def apply_operation(operation: str, number_a: int, number_b: int) -> int: """ Применяет указанную операцию на два числа. """ match operation: case '+': return number_a + number_b case '-': return number_a - number_b case '*': return number_a * number_b case '/': return round(number_a / number_b) case _: raise ValueError(f"операция '{operation}' не поддерживается") # Запрос и валидация операндов: while True: input_a = input("Число a: ") if is_valid_number(input_a): break print(f"'{input_a}' не является корректным восьмеричным числом. ") while True: input_b = input("Число b: ") if is_valid_number(input_b): break print(f"'{input_b}' не является корректным восьмеричным числом.") # Запрос и валидация операции: while True: operation = input("Введите операцию ('+', '-', '*', '/'): ") if operation in "+-*/": break print(f"Операция '{operation}' не поддерживается.") # Парсинг введённых чисел number_a = int(input_a, 8) number_b = int(input_b, 8) # Вычисление и вывод результата result = oct(apply_operation(operation, number_a, number_b))[2:] print(f"{input_a} {operation} {input_b} = {result}")