Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Stakewinner00 en 16 Septiembre 2012, 21:49 pm



Título: DUda c++
Publicado por: Stakewinner00 en 16 Septiembre 2012, 21:49 pm
Hola que tal, tras buscar por google y no encontrar nada me vi obligado a buscar ayuda.

El caso es que quiero hacer un programa que cree una tabla con todas las posibilidades para 0 y 1 con una longitud definida por el user.

Por ejemplo si pongo un 2 generara 2^2 que son 4 combinaciones 01 00 11 10 pense en buscar algun generador de diccionarios para fuerza bruta y basandome en eso generar una propio pero no encontre nada.

Nose si se me a entendido pero bueno, lo que necesito resumido es una ayudita para poder progresar con mi programa, si puede ser no pongais todo el programa entero que sino no aprendo nada.

Muchas gracias a todos, hoy estoy un poco espeso.


Título: Re: DUda c++
Publicado por: criskapunk en 16 Septiembre 2012, 23:59 pm
Buenas,

Vos querés generar todas las combinaciones de ceros y unos dada una longitud determinada. Se me ocurre hacer algo así (No se si está bien generalizado):

Para una longitud de 3 caracteres, tendrías 2^3 combinaciones, es decir 8 combinaciones totales. Entonces podrías hacer un bucle desde cero hasta (2^3)-1 e ir imprimiendo en cada iteración el valor del contador convertido a binario.
Es decir, en la primer vuelta el contador vale 0, en binario lo mismo. La segunda vale 1, nuevamente lo mismo en binario. En la tercera vale 2, es decir 10 en base 2, y así sucesivamente, irías mostrando todas las combinaciones posibles.

Te dejo el código en Python, no se C++. Creo que es bastante simple de entender, lo único que comenté fueron las funciones propias del lenguaje así ya tenés una base para buscar algo que cumpla una función similar en C++.

Código
  1. s = int(raw_input("Ingrese la longitud: "))
  2. i = 0
  3. while i < 2**s:
  4.  
  5.  # Convierte el valor del contador a binario
  6.  # Elimina los dos primero caracteres para no mostrar el '0b'
  7.  # Rellena a la izquierda con ceros, dependiendo de la longitud ingresada
  8.  
  9.  print bin(i)[2:].zfill(s)
  10.  i += 1

La salida del programa es la siguiente:

Código:
000
001
010
011
100
101
110
111

Un saludo.


Título: Re: DUda c++
Publicado por: Stakewinner00 en 17 Septiembre 2012, 14:55 pm
ok muchas gracias voy a probarlo.


Título: Re: DUda c++
Publicado por: Kasswed en 18 Septiembre 2012, 01:24 am
Código
  1. #include <iostream>
  2. #include <cmath>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. string DecToBin(const int& number);
  9.  
  10.  
  11. class Combo{
  12.   private:
  13.      vector<string> v;
  14.      int n; //Número de dígitos
  15.   public:
  16.      Combo(const int& digitos);
  17.      friend ostream& operator<<(ostream& os,const Combo& c);
  18. };
  19.  
  20.  
  21. Combo::Combo(const int& digitos){
  22.   n = digitos;
  23.   if(n > 0){
  24.      v.resize((int)pow(2,(double)n));
  25.      string tmp;
  26.      for(int i=0; i<(int)pow(2,(double)n); i++){
  27.          string aux(n,'0');
  28.          tmp = DecToBin(i);
  29.          aux.replace(aux.size()-tmp.size(),tmp.size(),tmp);
  30.          v[i] = aux;
  31.      }
  32.   }
  33. }
  34.  
  35. ostream& operator<<(ostream& os,const Combo& c){
  36.   for(int i=0; i<(int)pow(2,(double)c.n); i++) os << c.v[i] << endl;
  37.   return os;
  38. }
  39.  
  40. int main(){
  41.   int n;
  42.   cin >> n;
  43.   Combo aux(n);
  44.   cout << aux << endl;
  45. }
  46.  
  47. string DecToBin(const int& number){
  48.   if ( number == 0 ) return "0";
  49.   if ( number == 1 ) return "1";
  50.   if ( number % 2 == 0 ) return DecToBin(number / 2) + "0";
  51.   else return DecToBin(number / 2) + "1";
  52. }


Título: Re: DUda c++
Publicado por: Stakewinner00 en 18 Septiembre 2012, 15:09 pm
thanks kasswed