Rezolvare completă PbInfo #3013 Becuri1

Cerința

Gigel dorește să instaleze în grădină o ghirlandă cu N becuri colorate, numerotate de la 1 la N, care, din minut în minut, să se aprindă și să se stingă automat. Pentru a putea face aceasta el s-a gândit să asocieze fiecărui bec câte un număr, în felul următor: la fiecare minut, un bec se va aprinde dacă prima cifră a numărului asociat lui este număr prim, altfel becul va fi stins. Numerele asociate becurilor, au o proprietate specială, din minut în minut, acestea își mută circular cifrele spre stânga, la fiecare permutare prima cifra a fiecărui număr, devine ultima. Toată ghirlanda se va stinge, la momentul în care, numărul asociat, cu cele mai multe cifre, ajunge, din nou, la valoarea inițială (în acest timp, la fiecare minut, celelalte numere efectuează permutări).

Scrieți un program care să determine:
1. Câte becuri aprinse sunt în starea inițială;
2. Care este numărul maxim de becuri care pot fi aprinse la un moment dat;
3. Care este becul/becurile care se aprind de cele mai multe ori.

Date de intrare

Fișierul de intrare becuri1.in conține pe prima linie numărul C, ce reprezinta numărul cerinței, de pe cea de-a doua linie un număr natural N ce reprezintă numărul de becuri colorate, iar de pe următoarele N linii, câte un număr natural, ce reprezintă numărul asociat fiecărui bec, în ordinea crescătoare a numerelor de ordine.

Date de ieșire

Fișierul de ieșire becuri1.out dacă C=1 va conține pe prima linie, valoarea cerută la cerința 1. Dacă C=2 va conține pe prima linie, valoarea cerută la cerința 2. Dacă C=3 va conține pe prima linie, numerele de ordine (despărțite prin câte un spațiu) ale becurilor care se aprind de cele mai multe ori; afișarea se va face în ordinea crescătoare a numerelor de ordine atașate becurilor; dacă nu există astfel de becuri în ghirlandă, se va afișa -1.

Restricții și precizări

  • 1 ≤ N ≤ 100
  • numerele asociate becurilor sunt intre 0 și 1.000.000.000. Pot exista mai multe becuri cu același număr asociat

Exemplul 1:

becuri1.in

1
5
12
5
378
2015
8

becuri1.out

3

Explicație

Cerința 1.
Gigel are o ghirlandă cu 5 becuri. Primul bec are asociat numărul 12 și este stins. Al doilea bec are asociat numărul 5 și este aprins. Al treilea bec are asociat numărul 378 și este aprins. Al patrulea bec are asociat numărul 2015 și este aprins. Al cincilea bec are asociat numărul 8 și este stins.

Exemplul 2:

becuri1.in

2
5
12
5
378
2015
8

becuri1.out

4

Explicație

Cerința 2.
La minutul 0 numerele asociate becurilor sunt: 12, 5, 378, 2015 și 8. La minutul 1 numerele asociate becurilor vor fi: 21, 5, 783, 0152 și 8. La minutul 2 numerele asociate becurilor vor fi: 12, 5, 837, 1520 și 8. La minutul 3 numerele asociate becurilor vor fi: 21, 5, 378, 5201 și 8. Numărul maxim de becuri aprinse va fi 4, la minutul 3.

Exemplul 3:

becuri1.in

3
5
12
5
378
2015
8

becuri1.out

2

Explicație

Cerința 3.
Al doilea bec este cel care se va fi aprins de cele mai multe ori, deoarece numărul asociat cu cele mai multe cifre ajunge la valoarea inițială abia după 4 permutări, timp în care becul al doilea va fi aprins de 4 ori.

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

#include <iostream>
#include <fstream>

using namespace std;

int n, b[100];
long long v[100], p[100];

ifstream fin("becuri1.in");
ofstream fout("becuri1.out");

void citire(long long v[100], int n)
{
    int i;
    for(i=0; i<n; i++)
        fin>>v[i];
}

void numarare(long long p[100])
{
    int i,cp;
    for(i=0; i<n; i++)
    {
        p[i]=1;
        cp=v[i];
        if(cp==0)
            p[i]=1;
        else
        {
            while(cp)
            {
                p[i]*=10;
                cp/=10;
            }
            p[i]=p[i]/10;
        }
    }
}

void cerinta_1(long long v[100], int n)
{
    int i, ca=0;
    numarare(p);
    for(i=0;i<n;i++)
        if(v[i]/p[i]==2 || v[i]/p[i]==3 || v[i]/p[i]==5 || v[i]/p[i]==7)
            ca++;
    fout<<ca;
}

void cerinta_2(long long v[100], int n)
{
    int i, c=0, maxbec, maxp=0;
    numarare(p);
    for(i=0; i<n; i++)
    {
        if(p[i]>maxp)
            maxp=p[i];
        if(v[i]/p[i]==2 || v[i]/p[i]==3 || v[i]/p[i]==5 || v[i]/p[i]==7)
            c++;
    }
    maxbec=c;
    while(maxp!=1)
    {
        c=0;
        for(i=0; i<n; i++)
        {
            v[i]=v[i]%p[i]*10+v[i]/p[i];
            if(v[i]/p[i]==2 || v[i]/p[i]==3 || v[i]/p[i]==5 || v[i]/p[i]==7)
                c++;
        }
        if(c>maxbec)
            maxbec=c;
        maxp/=10;
    }
    fout<<maxbec;
}

void cerinta_3(long long v[100], int n)
{
    int i, maxp=0;
    numarare(p);
    for(i=0; i<n; i++)
    {
        if(p[i]>maxp)
            maxp=p[i];
        if(v[i]/p[i]==2 || v[i]/p[i]==3 || v[i]/p[i]==5 || v[i]/p[i]==7)
            b[i]++;
    }
    while(maxp!=1)
    {
        for(i=0; i<n; i++)
        {
            v[i]=v[i]%p[i]*10+v[i]/p[i];
            if(v[i]/p[i]==2 || v[i]/p[i]==3 || v[i]/p[i]==5 || v[i]/p[i]==7)
                b[i]++;
        }
        maxp/=10;
    }
    maxp=0;
    for(i=0;i<n;i++)
        if(b[i]>maxp)
            maxp=b[i];
    if(maxp==0)
        fout<<-1<<" ";
    else
    for(i=0; i<n; i++)
        if(b[i]==maxp)
            fout<<i+1<<" ";
}

int main()
{
    int c;
    fin>>c>>n;
    citire(v,n);
    switch(c)
    {
        case 1: cerinta_1(v, n); break;
        case 2: cerinta_2(v, n); break;
        case 3: cerinta_3(v, n); break;
    }
    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 #3013 Becuri1

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