Rezolvare completă PbInfo #874 Atomi

Cerința

Într-o galaxie îndepărtată există doar două elemente chimice. Cercetătorii le-au numit A şi B şi toate substanțele sunt alcătuite din aceste elemente. Mai precis, o substanță este un șir definit astfel:

  • A și B sunt substanțe, formate din câte un atom;
  • Ax și By sunt substanțe, x și y find numere naturale. Ax este formată din x atomi de tip A, iar By este formată din y atomi de tip B;
  • dacă S este substanță atunci (S)x este substanță, x fiind un număr natural. Dacă în S sunt p atomi, în (S)x vor fi p*x atomi;
  • dacă S şi T sunt substanțe atunci ST este substanță. Dacă în S sunt x atomi, iar în T sunt y atomi, în ST vor fi x+y atomi.

Pentru o substanță dată să se determine numărul atomilor de tip A şi numărul atomilor de tip B care o compun.

Date de intrare

Programul citește de la tastatură numărul un şir de caractere reprezentând substanța dată.

Date de ieșire

Programul va afișa pe ecran două numere nA nB, separate printr-un spațiu, reprezentând numărul atomilor de tip A, respectiv numărul atomilor de tip B din substanța dată.

Restricții și precizări

  • șirul dat are cel mult 255 de caractere

Exemplu

Intrare

(A3B2)2A3(B2)2

Ieșire

9 8

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema Atomi:

#include <iostream>
#include <cstring>
using namespace std;

char s[256];
int A[1000] , B[1000] , n , *v;
int main()
{
    cin >> s;
    n = 1;
    for(unsigned int i = 0 ; i < strlen(s) ; i ++)
        if(s[i] == '(')
            n++,A[n] = B[n] = 0;
        else
            if(s[i] == ')')
            {
                int x = 0;
                if(s[i+1]>='0' && s[i+1] <='9')
                {
                    while(s[i+1]>='0' && s[i+1] <='9')
                        x = 10 * x + s[i+1] - '0', i ++;
                }
                else
                    x = 1;
                A[n-1] += A[n] * x, B[n-1] += B[n] * x , n --;
            }
            else
            {
                //este A sau B
                if(s[i] == 'A')
                    v = A;
                else
                    v = B;
                int x = 0;
                if(s[i+1]>='0' && s[i+1] <='9')
                {
                    while(s[i+1]>='0' && s[i+1] <='9')
                        x = 10 * x + s[i+1] - '0', i ++;
                }
                else
                    x = 1;
                v[n] += x;
            }
    cout << A[1] << " " << B[1];
    return 0;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #874 Atomi

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #874 Atomi de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!