Pagini: [1]   În jos
  Imprimă  
Ajutor Subiect: Numere rotunde  (Citit de 9307 ori)
0 Utilizatori şi 1 Vizitator pe acest subiect.
Patrunjel
Strain
*

Karma: -12
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« : Octombrie 18, 2010, 21:15:25 »

Salut, am gasit o problema care suna cam asa: Se citeste de la tastatura un numar natural n.Sa se afiseze numerele rotunde mai mici decat n.(Un numar rotund este un numar care, reprezentat in binar, are acelasi numar de cifre de 0 si de 1)
Scurt pe doi: Cum se rezolva?
Adica ideea este sa fac o functie care sa verifice cum arata un numar in binar, sau ceva de genu.Ma gandeam la un for care sa ia numerele mai mici decat n, apoi sa le verifice sa vada daca indeplinesc conditia data, insa nu stiam ce conditie sa pun la for (ma gandisem la i<=n), insa ma temeam sa nu-mi scape cateva numere Smile
Singura idee care mi-a venit este sa iau numarul n, sa il scriu in binar, apoi sa gasesc toate combinatiile posibile de 0 si 1, apoi sa transform fiecare combinatie in numar in baza 10, insa sunt sigur ca nu e cea mai buna metoda, si nici nu a ajuns materia pana aici (problema e din subprograme).Ma poate ajuta cineva cu o idee? Smile
Memorat
sima_cotizo
Nu mai tace
*****

Karma: 219
Deconectat Deconectat

Mesaje: 596



Vezi Profilul
« Răspunde #1 : Octombrie 18, 2010, 21:53:41 »

Din moment ce stii sa scrii un numar in binar...  Eh?
Memorat
chera_lary
De-al casei
***

Karma: -2
Deconectat Deconectat

Mesaje: 106



Vezi Profilul
« Răspunde #2 : Octombrie 19, 2010, 12:53:48 »

In primul rand imi pare a tema!
Ideea este destul de simpla. In niciun caz nu vei genera toate posibilitatile de 0 si 1, care se genereaza prin met BackTracking ci rezolvarea se bazeaza pe reprezentarea numerelor in baza 2! Nu este nevoie sa convertesti un numar in baza 2 pentru ca pc-ul a facut-o deja pentru tine!

Cod:
#include <math.h>

int nr0=0, nr1=0;
for(int i=0;i<n;i++)
{
    nr0=nr1=0;
    for(int j=0;j<(int)(log(i)/log(2))+1;j++)
        (i&(1<<j))?nr1++:nr0++;
    if(nr1 == nr0) cout<<i<<" ";
}

Sper sa mearga, nu am verificat! Succes!
« Ultima modificare: Octombrie 19, 2010, 13:25:21 de către CHERA Laurentiu » Memorat
Patrunjel
Strain
*

Karma: -12
Deconectat Deconectat

Mesaje: 30



Vezi Profilul
« Răspunde #3 : Octombrie 19, 2010, 13:35:12 »

Multumesc mult, vad daca merge si revin cu un LE.
Nu, nu e tema, in clasa suntem abea la matrici patratice Smile)
Memorat
klamathix
Echipa infoarena
Nu mai tace
*****

Karma: 733
Deconectat Deconectat

Mesaje: 1.216



Vezi Profilul
« Răspunde #4 : Octombrie 19, 2010, 15:18:10 »

In primul rand imi pare a tema!
Ideea este destul de simpla. In niciun caz nu vei genera toate posibilitatile de 0 si 1, care se genereaza prin met BackTracking ci rezolvarea se bazeaza pe reprezentarea numerelor in baza 2! Nu este nevoie sa convertesti un numar in baza 2 pentru ca pc-ul a facut-o deja pentru tine!

Cod:
#include <math.h>

int nr0=0, nr1=0;
for(int i=0;i<n;i++)
{
    nr0=nr1=0;
    for(int j=0;j<(int)(log(i)/log(2))+1;j++)
        (i&(1<<j))?nr1++:nr0++;
    if(nr1 == nr0) cout<<i<<" ";
}

Sper sa mearga, nu am verificat! Succes!

Totusi, de ce nu ar folosi in niciun caz backtracking? Pe valori mai mari ale lui n , back-ul se comporta mai bine.
Memorat
chera_lary
De-al casei
***

Karma: -2
Deconectat Deconectat

Mesaje: 106



Vezi Profilul
« Răspunde #5 : Octombrie 19, 2010, 15:37:27 »

Nu am incercat! Nu sunt sigur ca back-ul are viteza mai buna decat log-ul! Stiam ca logul are rezolvare liniara! Backul are exponentiala plus ca daca aplici varianta recursiva mai ingreuneaza si ea!
Memorat
klamathix
Echipa infoarena
Nu mai tace
*****

Karma: 733
Deconectat Deconectat

Mesaje: 1.216



Vezi Profilul
« Răspunde #6 : Octombrie 19, 2010, 15:50:26 »

Varianta ta nu e liniara in functie de n , pentru ca mai faci log() operatii pt fiecare numar. E drept ca back-ul are complexitate exponentiala, dar in cazul asta exponentiala in functie de log(n).
Daca generezi direct comb(i , i / 2 ) cu i par si i <= [log ( 2 , n )] , iesi mai bine.

Sigur, pentru problema asta probabil nu merita efortul. Zic doar sa nu desfiintam back-ul pur si simplu fiindca stim noi ca e 'cea mai ineficienta metoda de programare'. Cateodata solutia care ne pare mai buna epuizeaza si ea la fel de multe stari , sau chiar mai multe decat back-ul , daca acesta e facut cat de cat ok. Mi-am amintit si de galagia care se facea pe forum dupa oji anul trecut , ca 'Vai de mine eu stiam back, dar n-am implementat fiindca stiam ca e cea mai ineficienta metoda. Cum sa se dea la olimpiada?'     
Memorat
Pagini: [1]   În sus
  Imprimă  
 
Schimbă forumul:  

Powered by SMF 1.1.19 | SMF © 2006-2013, Simple Machines