Rezolvare completă PbInfo #2330 prim023

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.

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 prim023:

#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;
}

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 #2330 prim023

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2330 prim023 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!