Sunteți pe pagina 1din 8

Vectori de frecventa

int fr[10]; //declararea vectorului de frecvente

///fr = numele vectorului

///10 = dimensiunea lui maximă

//Important! In memorie ele sunt reținute de la 0. Deci avem fr[0].. fr[9]. Total 10 elemente.

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 0 0 0 0 0 0 0 0

! Ultimul element este fr[9].

Pentru a accesa un element trebuie sa precizam numele vectorului si pozitia la care ne uitam.

Exemplu: fr[3] -> fr = numele vectorului si 3 este pozitia.

Este important ca in vectorul de frecventa sa avem initial pe toate pozitiile 0.

Deci dupa declarare vom initializa vectorul cu 0.

int main(){
int fr[10];
for (int i = 0; i<=9; i++) /// sau for(int i=0;i<10;i++)
fr[i]=0;
}

Problemă: 1. Se citește un număr n. Să se afișeze cifrele acestuia în ordine strict descrescătoare.

Exemplu: 277432

Se afiseaza: 7 4 3 2

Cum folosim vectorul de frecventa?

While(n!=0)
{
fr[n%10]=fr[n%10]+1;
n=n/10;
}

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 0 0 0 0 0 0 0 0
Pas 1:

fr[n%10] = fr[n%10]+1; (277432 % 10 = 2)

fr[2] = fr[2]+1; => fr[2] = 1 (pentru ca initial fr[2] era 0)

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 1 0 0 0 0 0 0 0

Mai departe,

n=n/10; => n=27743

Pas 2:

fr[n%10] = fr[n%10]+1; (27743 % 10 = 3)

fr[3] = fr[3] + 1; =>fr[3] = 1 (inițial pe poziția 3 avem conținutul 0)

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 1 1 0 0 0 0 0 0

Mai departe,

n=n/10; => n=2774

Pas 3:

fr[n%10] = fr[n%10]+1; (2774 % 10 = 4)

fr[4] = fr[4] + 1; =>fr[4] = 1 (inițial pe poziția 4 avem conținutul 0)

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 1 1 1 0 0 0 0 0

Mai departe,

n=n/10; => n=277

Pas 4:
fr[n%10] = fr[n%10]+1; (277 % 10 = 7)

fr[7] = fr[7] + 1; =>fr[7] = 1 (inițial pe poziția 7 avem conținutul 0)

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 1 1 1 0 0 1 0 0

Mai departe,

n=n/10; => n=27

Pas 5:

fr[n%10] = fr[n%10]+1; (27 % 10 = 7)

fr[7] = fr[7] + 1; =>fr[7] = 2 (pe poziția 7 avem conținutul 1)

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 1 1 1 0 0 2 0 0

Mai departe,

n=n/10; => n=2

Pas 5:

fr[n%10] = fr[n%10]+1; (2 % 10 = 2)

fr[2] = fr[2] + 1; =>fr[2] = 2 (pe poziția 2 avem conținutul 1)

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 2 1 1 0 0 2 0 0

Mai departe,

n=n/10; => n=0;

S-a oprit pentru ca indeplineste conditia de iesire din while.

Practic, rolul vectorului de frecventa este sa retina pentru fiecare cifra de cate ori apare ea in numar.

In cazul vectorilor de frecventa, pozitia vectorului face referire la numarul pentru care numaram.

Daca ne uitam la fr[7], adica pe pozitia 7, inseamna ca numarul 7 apare de 2 ori.


Daca fr[i] este 0 inseamna ca nu i nu a aparut in componenta lui n.

Ca sa afisam acum cifrele in ordine descrescatoare ale numarului intial n, parcurgem de la final
vectorul si acolo unde continutul este diferit de 0, afisam pozitia.

for( i = 9; i>=0; i -- )
{
if (fr[i] != 0)
cout<<i<<” ”;
}

Rezolvarea completa si finala a problemei de mai sus:

int main(){
int fr[10];
for (int i = 0; i<=9; i++)
{
fr[i]=0;
}
int n;
cout<<”n = ”;
cin>>n;
while ( n != 0 )
{
fr[n%10] = fr[n%10] + 1;
n = n/10;
}
for(i=9;i>=0;i--)
{
if(fr[i] != 0)
cout<<i<<” ”;
}
return 0;
}

Problema 2:

Sa se afiseze cifrele unui numar n in ordine descrescatoare.

Exemplu: 277432

Se afisa: 7 7 4 3 2 2

int main(){
int fr[10];
for (int i = 0; i<=9; i++)
{
fr[i]=0;
}
int n;
cout<<”n = ”;
cin>>n;
while ( n != 0 )
{
fr[n%10] = fr[n%10] + 1;
n = n/10;
}
for(i=9;i>=0;i--)
{
while( fr[i] != 0 )
{
cout<<i<<” ”;
fr[i] = fr[i] – 1;
}
}
return 0;
}

Inainte de afisare, vectorul de frecventa o sa arate asa:

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 2 1 1 0 0 2 0 0

In timpul afisarii o sa avem:

Pas 1:

Cat timp fr[9] != 0 .... Dar fr[9] == 0 deci nu intra in while

Pas 2:

Cat timp fr[8] != 0 .... dar fr[8] == 0 deci nu intra in while

Pas 3:

Cat timp fr[7] != 0 (OK)

Scrie i => scrie 7

Fr[7] = fr[7] – 1; deci fr[7] scade

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 2 1 1 0 0 1 0 0
Este fr[7] != 0? (OK)

Scrie 7

Fr[7] = fr[7] -1; deci fr[7] scade

fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] fr[6] fr[7] fr[8] fr[9]

0 0 2 1 1 0 0 0 0 0

Este fr[7] != 0? (NU)

Trece mai departe

Cat timp fr[6] != 0 ... dar fr[6] == 0 deci nu intra in while..

Si asa mai departe.

Problema 3:

Se citeste un numar n. Folosind vector de frecventa sa se afiseze mesajul „DA” daca numarul are cifre
distincte si mesajul „NU” in caz contrar.

Exemplu: Pentru n = 2773 => NU

Pentru n = 273 => DA

int main()
{
int n, i, fr[10], uc;
ok = 1; /// variabila care retine starea numarului.
/// e variabila care e 0 daca cifrele NU sunt distincte si e 1 daca cifrele SUNT distincte
for (i = 0 ; i <= 9; i++)
{
fr[i] = 0; ///fac initial vectorul de frecventa sa fie 0 peste tot
}
cin>>n;
while ( n != 0) ///cat timp am cifre in numar
{
uc = n%10; ///aflu ultima cifra
fr[uc] = fr[uc] + 1; ///cresc frecventa cifrei
n = n/10; ///tai ultima cifra numarului
}
for ( i = 0; i <= 9; i++ )
{
if (fr[i] > 1) ///daca o cifra apare mai mult de o singura data inseamna ca se repete
{
ok=0; ///e variabila care e 0 daca cifrele NU sunt distincte si e 1 daca cifrele SUNT distincte
}
}
if (ok == 0)
{
cout<<”NU”;
}
else
{
cout<<”DA”;
}
return 0;
}

Problema 4:

Se citeste un numar n. Sa se afiseze utilizand vectorul de frecventa cele mai mari 2 cifre ce nu apar in
numar.

Ex: n = 272954 se afiseaza 8 si 6.

int main ()
{
int n, i, fr[10], uc;
int contor = 0; //contor ce numara cate cifre am afisat. Daca am afisat 2 cifre ne oprim.
cin >> n;
for ( i = 0; i <= 9; i++)
{
fr[i]=0;
}
while (n != 0)
{
uc = n%10;
n = n/10;
fr[uc] = fr[uc] + 1;
}
for ( i = 9; i >= 0 && contor<2; i--)
{
if ( fr[i] == 0 )
{
cout << i;
contor = contor + 1; //cresc contorul dupa ce afisez.
}
}
return 0;
}

S-ar putea să vă placă și