#2579 Putere2Interval
Cerința
Se citesc 3 numere naturale n, a și b. Afișați primele n puteri ale lui 2, în ordine crescătoare, din intervalul [a,b]. Dacă nu există cel puțin n puteri ale lui 2 în interval, atunci se vor afișa cele care există.
Date de intrare
Programul citește de la tastatură numărul n, a și b, separate prin spații.
Date de ieșire
Programul va afișa pe ecran puterile lui 2 din intervalul [a,b].
Restricții și precizări
1 ≤ n ≤ 60
1 ≤ a ≤ b < 2^64
Exemplu
Intrare
2 6 35
Ieșire
8 16
Explicație
În interval există 3 puteri ale lui 2, dar s-au afișat doar n dintre ele.
Sursa mea:
#include <iostream>
using namespace std;
unsigned n,a,b;
int main()
{
cin>>n>>a>>b;
for(unsigned i=a;i<=b && n!=0;i++)
if(!(i&(i-1)))
{
cout<<i<<" ";
n--;
}
return 0;
}
Răspunsuri la întrebare
Hai ca i-am dat de cap.
N-am zis eu bine in threadul anterior.
Ca sa iti explic mai bine este bine sa stii ca valorile variabilelor pot fi vazute si in baza 2.
De exemplu avem numarul 14
In baza 2 el are valoarea 01110.
Operatorul & defapt este AND logic, adica ia bitii variabilelor si aplica logica AND pe ei.
Adica sa zicem ca avem 14 & 7
01110
00111
Ca sa facem AND intre cele 2 numere, luam fiecare bit de pe pozitia respectiva si facem AND pe bitul din cel de-al doilea numar, de pe aceeasi pozitie.
Logica AND este asa:
0 AND 0 = 0
1 AND 0 = 0
0 AND 1 = 0
1 AND 1 = 1
14 & 7 ar veni asa
00110
Deci rezultatul are 1 doar atunci cand este 1 in aceeasi pozitie de pe aceeasi variabila.
Si acel if (!(i&(i-1)) urmareste urmatoarea logica
For-ul se incrementeaza mereu iar if-ul se executa doar atunci cand gaseste o putere de-a lui 2
Sa ii dam lui i o valoare, putere de-a lui 2, 16 de exemplu
16 in binar este 10000
i-1 este 15 in acest caz, 01111
Si se face AND intre aceste 2 numere
10000
01111
Rezultatul este 00000 (zero, fals)
Avem negat in fata deci !(00000) = 1 adevarat si se executa if-ul
Este destul de avansata chestia, daca ai reusit sa intelegi esti tare