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
și1.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 .
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!