Informatică, întrebare adresată de pmarian98, 9 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
using namespace std;
long long n,a,b;
int main()
{
cin>>n>>a>>b;
for(int i=a;i<=b && n!=0;i++)
if(!(i&(i-1)))
{
cout< n--;
}
}
Este de 60%


boiustef: nu se vede bn codul... de ce e de 60? ce a dat evaluarea ?
checkmate1209: ce inseamna if(!(i&(i-1)))
checkmate1209: adica vreau sa inteleg de la ce vine si cum rezulta puterile lui 2
checkmate1209: va rog cine stie
checkmate1209: sa mi explice

Răspunsuri la întrebare

Răspuns de boiustef
4

#include <iostream>

#include <cmath>

using namespace std;

int main()

{

   unsigned long long n, a, b, k,p=1,i;

   cin >> n >> a >> b;

   k=log2(a);

   if (log2(a)!=(int)log2(a)) ++k;

   for (i=1; i<=k; ++i) p*=2;

   while (p<=b && n)

   {

       cout << p << " ";

       --n; p*=2;

   }

   return 0;

}



boiustef: putina mate ... folosind log2 pt a afla puterea lui 2 in apropierea extremitatii segmentului [a,b]
pmarian98: are timpu' de executia mai rapid decat metoda clasica
boiustef: :)) am spus eu ca e simpatica :)))
boiustef: :)) dar spuneam despre alta ...
pmarian98: mersi oricum
pmarian98: metoda propusa e tot mai simpla decat a ta :)
boiustef: am vazut...
boiustef: dar, zici timpul meu este mai bun, deci nu e rau
boiustef: voi fi multumit daca fac cERINTA LUI dOREL... Vad cineva a postt un raspuns, dar nu cred ca e valabil
abnegreap0b88w: mie mi se pare ca te-ai complicat. asta e solutioa mea si timpul e 0#include
using namespace std;

int main()
{
long long int n,a,b,x=1,cnt=0;
cin>>n>>a>>b;
while(x<=b && cnt!=n)
{
if(x>=a && x<=b) cout< x*=2;
}
return 0;
}
Alte întrebări interesante