Cerinţa. Este vorba de problema #254 pbinfo
Se dau n perechi de numere naturale a, b. Să se determine pentru fiecare pereche, dacă există, cea mai mare putere a lui 2 din intervalul determinat de a şi b.
Date de intrare
Programul citeşte de la tastatură numărul n, apoi n perechi de numere a, b.
Date de ieşire
Programul va afişa pe câte o linie ecranului, pentru fiecare interval dat, cea mai mare putere a lui 2 din interval, sau 0, dacă intervalul nu conţine nici o putere al lui 2.
Restricţii şi precizări
1 ≤ n ≤ 10000
fiecare dintre numerele a şi b au cel mult 9 cifre.
Exemplu
Date de intrare
3
2 69
20 10
19 25
Date de ieşire
64
16
0
Salut!Va rog mult sa ma ajutati la acesta problema cu explicatii la fiecare linie de cod c++. Am sa atasez codul care este 100% functional.
Răspunsuri la întrebare
Incep de la int main () in jos, cum restul e standard.
"int n, v[10001], a, b, t = 0, i;" - se declara toate variabilele de care vom avea nevoie in cadrul programului. v[10001] este un vector, pe cand restul sunt variabile simple si comune. Fiecare variabila va fi explicata mai jos, in functie de unde e folosita.
"cin >> n" - se citeste numarul (variabila) 'n', reprezentand, asa cum spune in problema, numarul de perechi de numere naturale.
"for (i = 1; i <=n; i++)
{
cin >> a >> b" - aici folosim un 'for' simplu care practic suna in felul urmator: declaram variabila 'i' ca fiind egala cu 1. Cat timp 'i' este mai mic sau egal cu 'n', citim perechi de numere a si b (cin >> a >> b). Cu fiecare pereche de numere a si b, crestem valoarea lui 'i' cu 1 (i++). In momentul in care valoarea lui 'i' o sa fie egala cu valoarea lui 'n', functia for va inceta sa mai ceara citirea de perechi de numere a si b.
Obs: se foloseste acolada imediat dupa 'for' pentru ca functiile fara acolada vor executa NUMAI linia de cod ce urmeaza imediat dupa ele (in cazul nostru, ar fi acel "cin"). Punand acolada, functia for executa TOATE liniile de cod din interiorul acoladei. In cazul nostru, inclusiv acel 'if'. Aceeasi observatie se aplica si la folosirea acoladelor in cazul functiei 'if' mentionata mai sus. Daca nu am folosi acolade, acel 'if' ar executa doar "a^=b", ceea ce ar fi incomplet. Daca in cazul nostru, acel 'if' este indeplinit, se vor efectua toate liniile de cod aflat intre acoladele specifice respectivului 'if'.
if (a<b)
{
a^=b;
b^=a;
a^=b;
}
Aceste linii de cod verifica, prin sintagma 'if', daca 'a' este mai mare decat 'b', lucru ce ar fi nedorit in problema ta. Daca 'if'-ul este indeplinit, acele 3 linii de cod dintre acolade nu fac decat sa schimbe valoarea lui a cu cea al lui b.
"int P = 1, maxi = 0;" - P reprezinta puteri ale lui 2. Maxi reprezinta cea mai mare putere dintr-un inverval. Maxi este de la sine '0' ca in cazul in care nu gasim nicio putere al lui 2 in interval, sa se afiseze 0 automat. P-ul e '1' fiind 2 la puterea 0 si ca sa putem sa il tot inmultim cu 2 de-a lungul programului.
while (P <= b)
{
+ tot codul dintre acolade (ca sa nu-l copiez)
}
Cat timp puterea lui 2 este mai mica sau egala cu b (numarul cel mai mare din interval), atunci efectuam tot ceea ce regasim intre acolade. Daca ar fi mai mare decat 'b', atunci puterea lui 2 ar depasi intervalul si nu ar fi corect. Revenind la acolade, in primul rand, verificam daca puterea este mai mare sau egala cu 'a' (numarul cel mai mic din interval) prin acel if. Daca nu ar fi mai mare sau cel putin egala cu 'a', atunci puterea lui 2 nu ar fi in interval si nu ar fi corect. Daca ar fi mai mic decat a, programul ar inmulti 'p'-ul cu 2 pana cand ar deveni mai mare. In momentul in care devine mai mare, incepe sa ii atribuie valoarea lui p, care deja e o putere al lui 2, lui maxi. Acest lucru se repeta pana cand p-ul depaseste valoarea lui b, moment in care functia while se opreste din a fi executata. Cel mai mare numar, putere al lui 2, va fi pastrat astfel in variabila maxi. Dat fiind faptul ca acest while se afla in acoladele de la primul 'for', acest while se va repeta si el pentru fiecare pereche de numere. Si cea mai mare putere al lui 2 din fiecare interval va fi stocata intr-un vector v.
v[++t] = maxi - practic pune cea mai mare putere al lui 2 din fiecare interval declarat pe pozitia t din vector. Cu fiecare valoarea adaugata in vector, valoarea lui 't' creste cu 1.
La final, afisam intreg vectorul, care reprezinta, din nou, cele mai mare puteri al lui 2 din fiecare interval. Vectorul se afiseaza printr-o functie 'for', al carui 'i' este mai mic sau egal cu 't'. Si fiecare valoare memorata prin sintaxa explicata mai sus (v[++t] = maxim) va fi afisata.
Poate m-am abatut putin sau explicat prea pe scurt unele aspecte. Te rog lasa comentarii aditionale unde nu ai inteles.