Python

Калькулятор выражений в обратной польской записи

Напишите калькулятор выражения обратной полировки. Выражение должно поддерживать числа, знаки двоичных операций '+', '-', '*', '/'. Польские обозначения пишутся в одну строку, а элементы польских обозначений разделяются произвольным количеством пробелов. Пробелы требуются, когда необходимо отделить два числа друг от друга, и разрешены для отделения друг от друга символов операции или символов операций и чисел, а также в начале и конце строки. Гарантируется, что польская нотация является действительной нотацией некоторого выражения. Пример польской записи:

1 2 3 +*
Числа-операнды записываются в пятисимметричной системе счисления (см., Например, описание троичной симметричной системы счисления). Отрицательные цифры симметричной пятикратной системы счисления: B для -2 и A для -1. Таким образом, число B2 в пятичленной симметричной системе счисления - это число -8 в десятичной системе счисления.

Калькулятор должен обрабатывать 27-битные числа с фиксированной запятой, в которых младшие 11 бит предназначены для дробной части, а старшие 16 бит - для целой части. Например, 120,0102 как 27-битное число с фиксированной запятой будет записано как 000000000000012001020000000.

На входе - числа, в которых целая часть отделяется от дробного символа «точка», и гарантируется, что целая часть числа содержит не более 16 значащих цифр, а в дробной части - не более 11 значащих цифр. . Число с нулевой дробной частью может не иметь дробной части.

Ваша программа должна вычислить выражение и вывести результат как 27-битное число в пятикратной симметричной нотации. Если во время вычисления возникает ошибка, например, результат вычисления операции после округления не может быть представлен с требуемой разрядностью, должна быть выведена строка ERROR.

При вычислении результата операций используйте округление до ближайшего представимого значения.

мой код:
s = input().split()
polskiu = [int(s[0])]
for i in range(len(s) - 2):
polskiu.append(int(s[i + 1]))
x = s[-1][i]
if x == '+':
g = polskiu.pop()
z = polskiu.pop()
polskiu.append(g + z)
elif x == '-':
g = polskiu.pop()
z = polskiu.pop()
polskiu.append(z - g)
elif x == '*':
g = polskiu.pop()
z = polskiu.pop()
polskiu.append(g * z)
print(polskiu[0])

У меня проблема с вводом и дальнейшей обработкой чисел, если я введу дробное число, то он покажет мне ошибку из-за того, что дальнейшие операции выполняются с изменением int()
PH
Pr0100 Haka
30
1. Числа НЕ целые, а дробные - в пятерично-симметричной системе счисления. Так что никакие int() не помогут.

2. Термин "бит" не применим. "Бит" - это только в двоичной системе. В троичной - уже не бит, а "трит". Так что в пятеричной либо "разряд", либо "пент".

5 ** 11 == 48828125. Имеет смысл все вводимые значения умножать на 48828125 и хранить как целые.

Преобразование строки c записью числа в пятеричной системе в целое число (отмасштабированное на 11 пятеричных разрядов) выглядит примерно так:

def pent_to_int(s):
~~res, pos, flg = 0, 11, False
~~for c in s:
~~~~if c in ['0', '1', '2']: res = res * 5 + ord(c) - ord('0')
~~~~elif c in ['A', 'B']: res = res * 5 + ord('@') - ord(c)
~~~~if flg: pos -= 1
~~~~else: flg = c == '.'
~~return res * (5 ** pos)

Если хочешь внутри калькулятора работать не с целыми, а с вещественными, то:

def pent_to_int(s):
~~res, pos, flg = 0, 0, False
~~for c in s:
~~~~if c in ['0', '1', '2']: res = res * 5 + ord(c) - ord('0')
~~~~elif c in ['A', 'B']: res = res * 5 + ord('@') - ord(c)
~~~~if flg: pos += 1
~~~~else: flg = c == '.'
~~return res / (5 ** pos)
TJ
Tursinbek Jetibaev
75 518
Лучший ответ
Pr0100 Haka СПАСИБО БОЛЬШОЕ, а в предпоследней строке где "elif: flg = c == '.' " между flg и c два равно ведь поставить?
Tursinbek Jetibaev answer = pent_to_int(s[0]) # надо же строку с числом передать
print(answer) # выдаст ответ в десятичной системе. Его ещё придётся переводить в пятеричную перед выводом.