Сделал 20 задание
This commit is contained in:
parent
8e49e267ba
commit
a06c679a8a
72
lesson.20.py
Normal file
72
lesson.20.py
Normal file
|
|
@ -0,0 +1,72 @@
|
|||
''' ****** Задание 20 из 20 *********
|
||||
* Напоследок последняя задача с ОПН. Операции, которые выполняются с одним значением, называются унарными, с двумя — бинарными, с тремя — тернарными.
|
||||
|
||||
Давайте улучшим наш калькулятор, добавив поддержку следующих операций:
|
||||
|
||||
бинарные:
|
||||
+ (сложение),
|
||||
- (вычитание),
|
||||
* (умножение),
|
||||
/ (деление нацело; для отрицательных чисел работает по тем же правилам, что и в Python);
|
||||
унарные:
|
||||
~ (унарный минус — меняет знак),
|
||||
! (факториал),
|
||||
# (клонирование — вернуть в стек значение дважды);
|
||||
тернарные:
|
||||
@ (возвращает в стек те же три значения, но в ином порядке: второе, третье, первое).
|
||||
Формат ввода
|
||||
Вводится одна строка, содержащая разделённые пробелами целые числа и знаки операций. Вместе они составляют корректное выражение в обратной польской нотации, не содержащее деления на ноль и взятия факториала от отрицательного числа.
|
||||
|
||||
Формат вывода
|
||||
Выводится одно целое число — результат вычисления выражения.
|
||||
|
||||
|
||||
Подсказка
|
||||
В первом примере стек по мере прочтения строки выглядит так:
|
||||
|
||||
7
|
||||
7 1
|
||||
7 1 10
|
||||
7 1 10 100
|
||||
7 1 10 100 100
|
||||
7 1 10 10000
|
||||
7 10 10000 1
|
||||
7 10 9999
|
||||
7 10009
|
||||
10016
|
||||
-10016
|
||||
Пример 1
|
||||
Ввод
|
||||
|
||||
7 1 10 100 # * @ - + + ~
|
||||
Вывод
|
||||
|
||||
-10016
|
||||
'''
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
def factorial(n):
|
||||
return n * factorial(n - 1) if n > 1 else 1
|
||||
|
||||
|
||||
data = list(input().split())
|
||||
result = [int(data[0])]
|
||||
for i in data[1:]:
|
||||
if i.isdigit():
|
||||
result.append(int(i))
|
||||
elif i == "/":
|
||||
a = result.pop()
|
||||
result[-1] //= a
|
||||
elif i == "~":
|
||||
result[-1] = -result[-1]
|
||||
elif i == "#":
|
||||
result.append(result[-1])
|
||||
elif i == "!":
|
||||
result[-1] = factorial(result[-1])
|
||||
elif i == "@":
|
||||
result.append(result.pop(-3))
|
||||
else:
|
||||
a = result.pop()
|
||||
exec("result[-1] " + i + "= a")
|
||||
print(result[0])
|
||||
Loading…
Reference in a new issue