Jump to content

SUBIECTE NOI
« 1 / 5 »
RSS
Incalzire casa fara gaz/lemne

Incalzire in pardoseala etapizata

Suprataxa card energie?!

Cum era nivelul de trai cam din a...
 probleme cu ochelarii

Impozite pe proprietati de anul v...

teava rezistenta panou apa calda

Acces in Curte din Drum National
 Sub mobila de bucatarie si sub fr...

Rezultat RMN

Numar circuite IPAT si prindere t...

Pareri brgimportchina.ro - teapa ...
 Lucruri inaintea vremurilor lor

Discuții despre TVR Sport HD.

Cost abonament clinica privata

Tremura toata, dar nu de la ro...
 

C++.Putere a lui 2.

- - - - -
  • Please log in to reply
22 replies to this topic

#1
TheMightyStefan

TheMightyStefan

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 01.12.2015
Salut.Acum 3 zile am inceput sa invat C++.Am rezolvat peste 90 de probleme si m-am descurcat excelent,insa am ajuns la una care imi da batai de cap:
Se da de la tastatura un numar natural in variabila n de tip long.Se cere sa se verifice daca n suma cifrelor lui n este o putere a lui 2.
Mai exact la partea in care verific daca suma cifrelor lui n este o putere a lui 2..
Aceasta este incercarea mea...Puteti sa imi oferiti o mana de ajutor?

#include <iostream>
using namespace std;
long n,u,OK,i,s;
int main()
{
cout<<"n=";
cin>>n;
s=0;
do{u=n%10;
n=n/10;
s+=u;
}
while(n>0);
OK=0;
while(i<=s/2){if(2^i==s)OK=1;
i++;
}
if(OK=1)cout<<"DA";
else cout<<"NU";
return 0;
}

#2
Redount2k9

Redount2k9

    Member

  • Grup: Members
  • Posts: 374
  • Înscris: 13.07.2010
2 ^ i nu inseamna "doi la puterea i", ci 2 xor i, care este o operatie pe biti.
http://www.cplusplus.com/doc/boolean/

#3
TheMightyStefan

TheMightyStefan

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 01.12.2015
Ok...Există vreun algoritm referitor la asta ?

Edited by TheMightyStefan, 01 December 2015 - 15:03.


#4
Redount2k9

Redount2k9

    Member

  • Grup: Members
  • Posts: 374
  • Înscris: 13.07.2010
Gandeste-te cum ai putea retine intr-o variabila o putere anume a lui 2 doar printr-un ciclu for.

EDIT: Sau gandeste-te la reprezentarea binara a puterilor lui 2 si a aceleiasi puteri a lui 2 din care scazi 1. Se observa ceva si foarte usor poti determina daca un numar este putere a lui 2 doar prin bitwise and, dar asta presupune sa ai habar cu ce se mananca bitii.

Edited by Redount2k9, 01 December 2015 - 15:09.


#5
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
Reprezinta puterile lui 2 in binar si poate observi o "coincidenta"

Edited by dani.user, 01 December 2015 - 15:17.


#6
neur0

neur0

    Guru Member

  • Grup: Senior Members
  • Posts: 26,795
  • Înscris: 01.11.2011
unsigned int x = s;
while (((x & 1) == 0) && x > 1)
   x >>= 1;
std::cout << ( x== 1 ? "Da" : "Nu");



#7
TheMightyStefan

TheMightyStefan

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 01.12.2015
<p><p>Am gasit solutia.Fiind la inceput nu prea stiu despre sistemul binar (0,1) sau biti...Stiu doar ca aproape tot ce tine de hardware are valori  puteri ale lui 2.Ex:Biti ale placii video,VRAM,RAM,capacitati de stocare.Multumesc pentru raspunsurile rapide si ajutorul acordat.Ce credeti?

Edited by TheMightyStefan, 01 December 2015 - 15:47.


#8
neur0

neur0

    Guru Member

  • Grup: Senior Members
  • Posts: 26,795
  • Înscris: 01.11.2011
Folosește tagul [code].

#9
TheMightyStefan

TheMightyStefan

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 01.12.2015
i=1;
    while(i MAI MIC DECAT s)i*=2;
    if(i==s)cout

Edited by TheMightyStefan, 01 December 2015 - 15:49.


#10
Cy_Cristian

Cy_Cristian

    Active Member

  • Grup: Members
  • Posts: 1,845
  • Înscris: 22.02.2009
Merge pe cazul tau, dar pe cazul general nu. Codul lui neur0 este o varianta corecta.

#11
TheMightyStefan

TheMightyStefan

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 01.12.2015
Sunt conștient de asta,însă deocamdată nu înțeleg codul lui neur0.

Multumesc pentru ajutor.

#12
neur0

neur0

    Guru Member

  • Grup: Senior Members
  • Posts: 26,795
  • Înscris: 01.11.2011
Atâta timp cât numărul este divizibil cu 2 și mai mare ca 1 îl împarți la 2. Dacă rămâi cu 0 este suma puterilor lui 2, dacă rămâi cu 1, nu este. Și-ul pe biți cu 1 îți extrage bitul cel mai puțin semnificativ, dacă e 1, înseamnă că numărul nu e diviziibil cu 2. Dacă deplasezi un număr spre dreapta cu o poziție, faci o împărțire la 2.

Este echivalent cu a scrie:

Quote

while (((x % 2) == 0) && x > 1)
   x /= 2;

doar că este mai rapid.

Edited by neur0, 01 December 2015 - 16:39.


#13
TheMightyStefan

TheMightyStefan

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 01.12.2015
Multumesc.Am înțeles acum.Prima scriere nu-mi era familiară.

#14
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014
Uite cea mai simpla explicatie posibila :

int s=0 ,n ;
cin>>n;

while(n!=0)	 //suma cifrelor
{
S = S+n%10;
n=n/10;
}

int putere=2;

while ( putere<=S) putere = putere*2 ; //ridicam la doi si vedem daca rezultatul
if(putere == S) cout<<"este ";			   //este sau nu egal cu suma si daca este
else cout<<"nu este";					 //atunci e putere


Edited by VladBtz, 01 December 2015 - 18:25.


#15
dani.user

dani.user

    Guru Member

  • Grup: Senior Members
  • Posts: 30,194
  • Înscris: 24.02.2007
int isPowerOfTwo(int value)
{
   return ((-1 ^ value) & (value - 1)) == (value - 1);
}



#16
TheMightyStefan

TheMightyStefan

    Junior Member

  • Grup: Junior Members
  • Posts: 27
  • Înscris: 01.12.2015

View PostVladBtz, on 01 decembrie 2015 - 18:23, said:

Uite cea mai simpla explicatie posibila :

int s=0 ,n ;
cin>>n;

while(n!=0)     //suma cifrelor
{
S = S+n%10;
n=n/10;
}

int putere=2;

while ( putere<=S) putere = putere*2 ; //ridicam la doi si vedem daca rezultatul
if(putere == S) cout<<"este ";               //este sau nu egal cu suma si daca este
else cout<<"nu este";                     //atunci e putere


Exact asta am facut si eu mai sus.Multumesc oricum Posted Image.

#17
VladBtz

VladBtz

    Active Member

  • Grup: Members
  • Posts: 1,702
  • Înscris: 24.09.2014

View PostTheMightyStefan, on 02 decembrie 2015 - 19:31, said:

Exact asta am facut si eu mai sus.Multumesc oricum Posted Image.


Daca l-ai facut de ce ai mai cerut ajutor ? Uitandu-ma la primul tau cod vad greseli . Acel do while e dubios rau , OK e aproape inutil .... foloseste codeblocks ca IDE si invata sa faci debug . Apropo , de ce toate variabilele de tip long daca doar n-ul zice ca e long? te durea mana sa le faci int ? In codul meu in loc de putere pot sa reutilizez  n-ul sia sa sa am doar 2 variabile

Edited by VladBtz, 02 December 2015 - 22:30.


#18
neur0

neur0

    Guru Member

  • Grup: Senior Members
  • Posts: 26,795
  • Înscris: 01.11.2011
Altfel:

bool EPutereaLuiDoi(unsigned int x)
{
	return (x != 0) && ((x & (x - 1)) == 0);
}



Anunturi

Chirurgia spinală minim invazivă Chirurgia spinală minim invazivă

Chirurgia spinală minim invazivă oferă pacienților oportunitatea unui tratament eficient, permițându-le o recuperare ultra rapidă și nu în ultimul rând minimizând leziunile induse chirurgical.

Echipa noastră utilizează un spectru larg de tehnici minim invazive, din care enumerăm câteva: endoscopia cu variantele ei (transnazală, transtoracică, transmusculară, etc), microscopul operator, abordurile trans tubulare și nu în ultimul rând infiltrațiile la toate nivelurile coloanei vertebrale.

www.neurohope.ro

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users

Forumul Softpedia foloseste "cookies" pentru a imbunatati experienta utilizatorilor Accept
Pentru detalii si optiuni legate de cookies si datele personale, consultati Politica de utilizare cookies si Politica de confidentialitate