DUda c++

Iniciado por Stakewinner00, 16 Septiembre 2012, 21:49 PM

0 Miembros y 2 Visitantes están viendo este tema.

Stakewinner00

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.

criskapunk

#1
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 (python) [Seleccionar]
s = int(raw_input("Ingrese la longitud: "))
i = 0
while i < 2**s:
 
  # Convierte el valor del contador a binario
  # Elimina los dos primero caracteres para no mostrar el '0b'
  # Rellena a la izquierda con ceros, dependiendo de la longitud ingresada
 
  print bin(i)[2:].zfill(s)
  i += 1


La salida del programa es la siguiente:

000
001
010
011
100
101
110
111


Un saludo.

Stakewinner00

ok muchas gracias voy a probarlo.

Kasswed

Código (cpp) [Seleccionar]
#include <iostream>
#include <cmath>
#include <string>
#include <vector>

using namespace std;

string DecToBin(const int& number);


class Combo{
  private:
     vector<string> v;
     int n; //Número de dígitos
  public:
     Combo(const int& digitos);
     friend ostream& operator<<(ostream& os,const Combo& c);
};


Combo::Combo(const int& digitos){
  n = digitos;
  if(n > 0){
     v.resize((int)pow(2,(double)n));
     string tmp;
     for(int i=0; i<(int)pow(2,(double)n); i++){
          string aux(n,'0');
         tmp = DecToBin(i);
         aux.replace(aux.size()-tmp.size(),tmp.size(),tmp);
         v[i] = aux;
     }
  }
}
     
ostream& operator<<(ostream& os,const Combo& c){
  for(int i=0; i<(int)pow(2,(double)c.n); i++) os << c.v[i] << endl;
  return os;
}

int main(){
  int n;
  cin >> n;
  Combo aux(n);
  cout << aux << endl;
}

string DecToBin(const int& number){
  if ( number == 0 ) return "0";
  if ( number == 1 ) return "1";
  if ( number % 2 == 0 ) return DecToBin(number / 2) + "0";
  else return DecToBin(number / 2) + "1";
}

"He who allows himself to be insulted, deserves to be."

Repórtame cualquier falta a las normas del foro por mensaje privado.

Stakewinner00