Informatică, întrebare adresată de checkmate1209, 8 ani în urmă

#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;
}


checkmate1209: pt cine citește, trebuie sa înțeleg cum functioneaza rezolvarea aia
checkmate1209: am uitat sa specific

Răspunsuri la întrebare

Răspuns de sprintdragos
1

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


checkmate1209: BAAAA DECI NU CRED !!! DAAA AM ÎNȚELES
checkmate1209: MERSIII
checkmate1209: TU EȘTI TARE
checkmate1209: !!?
checkmate1209: !!*
sprintdragos: Ma bucur ;) cu placere
checkmate1209: iti sunt recunoscator
checkmate1209: ;)
Alte întrebări interesante