Rezolvare completă PbInfo #1926 NumarSpecial

Cerința

Se dă un şir format din n numere naturale . Un număr din şir se numeşte special de ordin k dacă suma cifrelor sale este divizibilă cu 9, iar cele k numere situate înaintea sa în şir şi cele k numere situate după el în şir sunt prime. Se cere să se afle câte numere speciale de ordin 0 şi câte numere speciale de ordin 1 sunt în şir, precum şi ordinul maxim al unui număr special din şir.

Date de intrare

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

Date de ieșire

Fișierul de ieșire numarspecial.out va conține pe prima linie numărul A, reprezentând numărul numerelor speciale de ordin 0 din şir, pe a doua linie numărul B, reprezentând numărul numerelor speciale de ordin 1 din şir, iar pe a treia linie ordinul maxim al unui număr special din şir.

Restricții și precizări

  • 1 ≤ n ≤ 1.000.000
  • numerele din şir sunt mai mici decât 1.000.000
  • dacă un număr este special de ordin k, atunci el este şi special de ordin k-1, k-2,…, 1 , 0
  • prima cerinţă se notează cu 40p, a doua cu 40p şi a treia cu 20p
  • pentru a obţine punctaje parţiale trebuie ca în fişierul numarspecial.out să afişaţi trei numere

Exemplu

numarspecial.in

13
3 72 5 7 2 2 891 2 13 29 5 27 1

numarspecial.out

3
2
4

Explicație

În şir sunt 3 numere speciale de ordin 0, şi anume 72, 891 şi 27 , două numere speciale de ordin 1, respectiv 72 şi 891, iar ordinul maxim al unui număr special este 4, al numărului 891 ( are 4 numere prime înaintea sa şi 4 după el).

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

#include <fstream>

using namespace std;
ifstream f("numarspecial.in");
ofstream g("numarspecial.out");
long long n , i , j , minim , maxim , a , b , p , q , x ;
int v[1000002] ;

int main()
{
    f >> n ;
    a = 0 ;
    b = 0 ;
    maxim = 0 ;
    // eratostene
    v[1] = 1 ;
    for( i=2 ; i<=1000000 ; i++ )
      if ( v[i]==0 )
      {
          j = i * i ;
          while ( j<=1000000 )
          {
              v[j] = 1 ;
              j = j + i ;
          }
      }
     //prelucrare sir
     q = 0 ;
     for ( i=1 ; i<=n ; i++ )
     {
         f >> x ;
         if ( v[x]==0 ) q++ ;
         else
         {
            if (( p>0 ) and ( q>0 )) b++ ;
            if ( p>q ) minim = q ;
            else minim = p ;
            if ( minim>maxim ) maxim = minim ;
            if ( x%9==0 ) { a++ ; p=q ; q=0 ; }
            else { p=0 ; q=0 ; }
         }
     }
     if ( v[x]==0 )
     {
        if (( p>0 ) and ( q>0 )) b++ ;
        if ( p>q ) minim = q ;
        else minim = p ;
        if ( minim>maxim ) maxim = minim ;
     }
     g << a << "\n" << b <<"\n" << maxim ;
    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 #1926 NumarSpecial

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