# PBinfo #4238 – NrZero – Rezolvare C++

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

## Enunț

Cerinţa
Scrieţi definiția completă a subprogramului C++ cu antetul:

int NrZero(int a[], int n)
care are doi parametri:  


a, prin care primeşte un tablou unidimensional care memorează numai cifre, astfel: cifrele impare se află la începutul vectorului ordonate descrescător, iar cifrele pare se găsesc la finalul vectorului, ordonate crescător
n, numărul efectiv de elemente ale tabloului

Subprogramul returnează numărul de valori egale cu 0 din vectorul a.

Restricţii şi precizări

0 ≤ a[i] ≤ 9
2 ≤ n ≤ 500.000
Elementele vectorului a sunt indexate de la 1
Cifrele impare se află la începutul vectorului ordonate descrescător, iar cifrele pare se găsesc la finalul vectorului, ordonate crescător.
Rezolvați eficient problema, deoarece funcția se va apela de mai multe ori.

Exemplu:
Dacă n=13, a=(7,7,3,1,1,0,0,0,2,2,4,6,6), funcția va returna 3, deoarece sunt trei cifre de zero în a.
Dacă n=7, a = (7,1,2,2,4,4,8), funcția va returna 0.

Important
Soluţia propusă va conţine doar definiţia subprogramului cerut. Prezenţa în soluţie a altor instrucţiuni poate duce erori de compilare sau de execuţie care vor avea ca efect depunctarea soluţiei.

## Cod sursă C++

```cpp
int NrZero(int a[], int n)
{
    int st, dr, mid, p, q;
    /// cauta cea mai din stanga pozitie p cu a[p] = 0
    p = -1; st = 1; dr = n;
    while (st <= dr)
    {
        mid = (st + dr) / 2;
        if (a[mid] % 2 == 1) st = mid + 1;
        else if (a[mid] > 0) dr = mid - 1;
        else /// a[mid] = 0
        {
            p = mid;
            dr = mid - 1;
        }
    }
    if (p == -1) return 0;
    /// cauta cea mai din dreapta pozitie q cu a[q] = 0
    q = -1; st = 1; dr = n;
    while (st <= dr)
    {
        mid = (st + dr) / 2;
        if (a[mid] % 2 == 1) st = mid + 1;
        else if (a[mid] > 0) dr = mid - 1;
        else /// a[mid] = 0
        {
            q = mid;
            st = mid + 1;
        }
    }
    return q - p + 1;
}
```

## Resurse

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