Матч
200, Без порядка операций (NoOrderOfOperations)
Дивизион 2, Уровень
1
В строке задано арифметическое
выражение, содержащее однозначные числа и операции ‘+’, ‘-’ или ‘*’. Выражение
не содержит пробелов. Необходимо найти значение этого выражения, если известно,
что все операции имеют одинаковый приоритет и выполняются слева направо.
Класс: NoOrderOfOperations
Метод: int
evaluate(String expr)
Ограничения:
expr содержит до 17 символов включительно,
expr содержит нечетное количество символов, выражение имеет формат
“<цифра><операция><цифра>...<операция><цифра>”,
где <операция> является одним из символов ‘+’, ‘-’, ‘*’.
Вход. Строка expr содержит входную
строку с арифметическим выражением.
Выход. Значение выражения, заданного в строке expr.
Пример входа
expr |
“3+5*7” |
“4-8*9*1” |
“0” |
“1*2*3*4*5*6*7*8*9” |
Пример выхода
56
-36
0
362880
РЕШЕНИЕ
обработка строк
Присвоим изначально результату
значение первой цифры. Пока не конец строки, читаем по два символа,
обрабатываем текущую операцию и второй операнд.
ПРОГРАММА
#include <cstdio>
#include <string>
using namespace std;
class NoOrderOfOperations
{
public:
int evaluate(string expr)
{
int i, res = expr[0] - '0';
for(i = 1; i < expr.size(); i += 2)
if (expr[i] == '+')
res += expr[i+1] - '0';
else if
(expr[i] == '-') res -= expr[i+1] - '0';
else res *= expr[i+1] - '0';
return res;
}
};