Матч 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;

  }

};