# PBinfo #1126 – Betisoare – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Se presupune că unele dintre primele instrumente de calcul au fost beţişoarele de socotit. În problema noastră vom considera un număr ca fiind o succesiune de unul sau mai multe beţişoare, un beţişor fiind reprezentat de litera I. Într-o expresie, între oricare două numere există semnul + sau semnul *.

Exemple:
 Numere
I
III
IIIIIIIIIII

 Expresii
III
II*III
I+I*III+IIIIIII


Cerinţă
Scrieţi un program care evaluează astfel de expresii.

Date de intrare
Fișierul de intrare betisoare.in conține pe prima linie o valoare naturală n, care indică numărul de expresii care trebuie evaluate. Fiecare dintre următoarele n linii conţine un şir de maximum 1.000.000 caractere care reprezintă expresia ce trebuie evaluată.

Date de ieșire
Fișierul de ieșire betisoare.out va conține pe fiecare linie i dintre primele n linii câte un număr întreg care reprezintă rezultatul evaluării expresiei de pe linia i+1 din fişierul de intrare.

Restricții și precizări

1 ≤ n ≤ 10
O expresie poate avea cel puţin 1 caracter şi cel mult 1.000.010 de caractere.
Valorile calculate pe parcurs şi valoarea finală au maximum 18 cifre.
Dintre teste, 26% conţin numai operaţii de adunare, 22% numai operaţii de înmulţire, iar restul de 52% conţin ambele operaţii.

Exemple
 betisoare.in  betisoare.out 

1
I+I*III+IIIIIII



11



2
IIII
I+I



4
2



3
I+I+I+I+I+I+I+I+I
I*I*I*I*I*I*I
IIII*IIII+I



9
1
17

## Cod sursă C++

```cpp
//Marinel Serban - martie 2014
//citire caracter cu caracter
//nu utilizeaza nici o biblioteca, doar tipuri standard
#include <fstream>
#define NMAX 1000010
using namespace std;
ifstream fin("betisoare.in");
ofstream fout("betisoare.out");
int n, i;
long long suma, factor, valoare, termen;
char c, semn_urmator;
int main()
{
   fin >> n;
   fin.get();                             //trec de ENTER
   for (i = 1; i <= n; i++)
   {
      //calculeaza cea de-a i-a expresie
      suma = 0;                           //initializez suma
      termen = 1;                         //initializez termen
      factor = 0;                         //iitializez factor
      fin.get(c);
      while (c != '+' && c != '*' && c != '\n')//primul termen/factor
      {
         factor++;
         fin.get(c);
      }
      semn_urmator = c;                   //retin semnul urmator
      while (c != '\n')                   //cat timp mai am termeni sau factori
      {
         if (semn_urmator == '+' || c == '\n')
            {                             //adun termenul
                termen *= factor;
                suma += termen;
                termen = 1;
            }
         else
            termen *= factor;             //inca e produs
         factor = 0;                      //reinitializez factorul
         fin.get(c);
         while (c != '+' && c != '*' && c != '\n') //alt factor
         {
            factor++;
            fin.get(c);                   //urmatorul semn
         }
         semn_urmator = c;                //il retin
      }
      if (suma == 0)
         suma = termen * factor;
      else
         suma += termen * factor;
      fout << suma << '\n';               //afisez rezultat
   }
   fout.close();
   return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/1126)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/1126/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-1126/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
