Сделал 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