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 |
C++.Putere a lui 2.
Last Updated: Dec 03 2015 16:47, Started by
TheMightyStefan
, Dec 01 2015 14:34
·
0
#1
Posted 01 December 2015 - 14:34
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
Posted 01 December 2015 - 14:59
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
Posted 01 December 2015 - 15:02
Ok...Există vreun algoritm referitor la asta ?
Edited by TheMightyStefan, 01 December 2015 - 15:03. |
#4
Posted 01 December 2015 - 15:04
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
Posted 01 December 2015 - 15:09
Reprezinta puterile lui 2 in binar si poate observi o "coincidenta"
Edited by dani.user, 01 December 2015 - 15:17. |
#6
Posted 01 December 2015 - 15:12
unsigned int x = s; while (((x & 1) == 0) && x > 1) x >>= 1; std::cout << ( x== 1 ? "Da" : "Nu"); |
#7
Posted 01 December 2015 - 15:36
<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. |
#9
Posted 01 December 2015 - 15:49
i=1;
while(i MAI MIC DECAT s)i*=2; if(i==s)cout Edited by TheMightyStefan, 01 December 2015 - 15:49. |
#10
Posted 01 December 2015 - 16:12
Merge pe cazul tau, dar pe cazul general nu. Codul lui neur0 este o varianta corecta.
|
|
#11
Posted 01 December 2015 - 16:33
Sunt conștient de asta,însă deocamdată nu înțeleg codul lui neur0.
Multumesc pentru ajutor. |
#12
Posted 01 December 2015 - 16:38
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
Posted 01 December 2015 - 16:49
Multumesc.Am înțeles acum.Prima scriere nu-mi era familiară.
|
#14
Posted 01 December 2015 - 18:23
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
Posted 02 December 2015 - 10:36
int isPowerOfTwo(int value) { return ((-1 ^ value) & (value - 1)) == (value - 1); } |
|
#16
Posted 02 December 2015 - 19:31
VladBtz, 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 . |
#17
Posted 02 December 2015 - 22:27
TheMightyStefan, on 02 decembrie 2015 - 19:31, said:
Exact asta am facut si eu mai sus.Multumesc oricum . 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
Posted 03 December 2015 - 11:06
Altfel:
bool EPutereaLuiDoi(unsigned int x) { return (x != 0) && ((x & (x - 1)) == 0); } |
Anunturi
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users