# PBinfo #2330 – prim023 – Rezolvare C++

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

## Enunț

Cerința
Dorel a scris un şir format din n numere naturale nenule. Apoi a luat fiecare subşir şi a calculat produsul termenilor săi. Aflaţi câte dintre produsele efectuate sunt numere prime.

Date de intrare
Fișierul de intrare prim023.in conține pe prima linie numărul n, iar pe a doua linie n numere naturale nenule separate prin spații.

Date de ieșire
Fișierul de ieșire prim023.out va conține pe prima linie numărul produselor care sunt numere prime.

Restricții și precizări

1 ≤ n ≤ 5000
numerele de pe a doua linie a fișierului de intrare vor fi mai mici decât 1.000.000.000
un subşir conţine cel puţin un termen şi se formează alegând o parte din termenii şirului

Exemplu:
prim023.in

3
1 2 3 
prim023.out

4
Explicație
Subşirurile care au produsul elementelor număr prim sunt: 2 ; 3 ; 1,2 ; 1,3.

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
ifstream f("prim023.in");
ofstream g("prim023.out");
int n,i,j,k,p,u,x,ok,t,v[32001],prim[3500] ;
int main()
{
    f >> n ;
    v[1] = 1 ;
    v[2] = 0 ;
    k = 0 ;
    for ( i=2 ; i<=32000 ; i++ )
        if ( v[i]==0 )
    {
        k++ ;
        prim[k] = i ;
        j = i+i ;
        while ( j<=32000 )
        {
            v[j] = 1 ;
            j = j+i ;
        }
    }
    u = 0 ;
    p = 0 ;
    for ( i=1 ; i<=n ; i++ )
    {
        f >> x ;
        if ( x==1 ) u++ ;
        else
        {
            ok = 1 ;
            j = 1 ;
            while (( prim[j]*prim[j]<=x )and( ok==1 ))
                if ( x%prim[j]==0 ) ok = 0 ;
                else j++ ;
            if ( ok==1 ) p++ ;
        }
    }
    if ( p==0 ) g << 0 ;
    else if ( u==0 ) g << p ;
         else
         {
             v[1] = p ;
             k = 1 ;
             for( i=1 ; i<=u ; i++ )
             {
                 t = 0 ;
                 for( j=1 ; j<=k ; j++ )
                 {
                     x = ( v[j]*2+t )%10 ;
                     t = ( v[j]*2+t)/10 ;
                     v[j] = x ;
                 }
                 while ( t>0 )
                 {
                     k++ ;
                     v[k] = t%10 ;
                     t = t/10 ;
                 }
             }
             for ( i=k ; i>=1 ; i-- )
                g << v[i] ;
         }
    return 0;
}
```

## Resurse

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