Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: peterfly en 13 Julio 2012, 21:58 pm



Título: Como saber todas las combinaciones posibles de letras y numeros?
Publicado por: peterfly en 13 Julio 2012, 21:58 pm
Hola y espero que me puedan ayudar...

Hoy me he encontrado con un problema...

Quisiera saber el número de combinaciones que se pueden generar con las 27 letras del alfabeto + los 10numeros (del 0 al 9) y cuales son esas combinaciones.

Es decir, todas las combinaciones posibles de de las letras mayúsculas + letras minúsculas + los numeros.

He pensado que podría hacer un programa en C que me hiciera esta función... pero la verdad es que después de mirar un poco mis apuntes no tengo nada parecido...

Bueno, si alguien fuera tan amable de guiarme un poco en mi proyecto a seguir le estaría eternamente agradecido.

Y bueno si alguien conoce otra forma o algun programa que haga esto... igualmente me vale, no hace falta que lo programe yo necesariamente xD

Muchas gracias de antemano.


Título: Re: Como saber todas las combinaciones posibles de letras y numeros?
Publicado por: DickGumshoe en 13 Julio 2012, 22:10 pm
¡Hola!

Precisamente estos días hemos estado tratando un tema muy parecido en el foro. Es este: http://foro.elhacker.net/programacion_cc/como_hacer_un_generador-t366597.0.html

¿Lo que quieres es que en cada combinación aparezcan todas las letras del abecedario, tanto en mayúsculas como en minúsculas y los números del 1 al 9? El programa en sí no sería complicado de hacer, pero tardaría mucho en finalizar la ejecución del programa (ten en cuenta que son 26 * 2 + 9 caracteres, es decir, 61 caracteres en total, y en cada secuencia también hay 61 caracteres. Por lo tanto hay 8,03748056 × 10108 combinaciones posibles...).

*Digo 26 caracteres porque no cuento la 'ñ'.

Aquí te dejo un código que genera todas las combinaciones posibles desde AAAAA00000 hasta ZZZZZ99999:

Código
  1. #include <stdio.h>
  2.  
  3. FILE *fp;
  4.  
  5. void numeros(char *Letras, int n)
  6. {
  7. int i;
  8. for(i=0;i<100000;i++)printf("%s%.5d\n",Letras, i);
  9. }
  10.  
  11. void Generador(char *Letras, int n)
  12. {
  13.    int count, resta=1, llamada;
  14.    while(llamada != 5)
  15.    {
  16.        numeros(Letras, n);
  17.        count = n;
  18.        Letras[n]++;
  19.        llamada = 0;
  20.        while(count >= 0)
  21.        {
  22.            if(Letras[count] > 90)
  23.            {
  24.                Letras[count] = 65;
  25.                Letras[count-1]++;
  26.                llamada++;
  27.            }
  28.            count--;
  29.            resta++;
  30.        }
  31.    }
  32. }
  33. int main()
  34. {
  35.    char Letras[] = "AAAAA";
  36.    fp = fopen("combinacion.txt", "w");
  37.    Generador(Letras, 4);
  38.    fclose(fp);
  39.    return 0;
  40. }
  41.  

No obstante, en el tema que te he pasado encontrarás el planteamiento y las soluciones de otros usuarios (algunas de ellas son geniales!), así que te vendrá muy bien pasarte por allí para que te vayas haciendo una idea de cómo hacer tu código.

Saludos!


Título: Re: Como saber todas las combinaciones posibles de letras y numeros?
Publicado por: 0xDani en 13 Julio 2012, 22:50 pm
Tambien, cuando veas esa tema, te daras cuenta de que si quieres almacenar todas esas combinaciones en archivos necesitaras varios cientos de TB.

Saludos.

PD: Si esa era tu intencion, siento decepcionarte :-\


Título: Re: Como saber todas las combinaciones posibles de letras y numeros?
Publicado por: peterfly en 15 Julio 2012, 01:20 am
muchas gracias amigos...

pero una duda..

con el código sacado del enlace que me pasaste:
Código:
#include <stdio.h>
 
FILE *fp;
 
void numeros(char *Letras, int n)
{
 int i;
 for(i=0;i<100000;i++)
 {
     printf("%s%.5d\n",Letras, i);
     fprintf(fp, "%s%.5d\n", Letras, i);
 }
 
}
 
void PrimeraLetra(char *Letras, int n)
{
 
    numeros(Letras, n);
    Letras[n]++; //Pasamos al siguiente carácter [al siguiente valor ASCII]
    if(Letras[n] <= 90) PrimeraLetra(Letras, n); /*90 es el valor ASCII de  'Z'. Si no se ha superado
                                                                                  ese valor, significa que el nuevo carácter está
                                                                                  comprendido entre la 'A' y la 'Z', y, por tanto, es
                                                                                  un carácter de los que queremos generar. Así, llamamos
                                                                                  a la función de nuevo.*/
    else Letras[n] = 65;
}
 
void SegundaLetra(char *Letras, int n) //Algo similar a la función anterior.
{
    PrimeraLetra(Letras, n);
    Letras[n-1]++;
    if(Letras[n-1] <= 90) SegundaLetra(Letras, n);
    else Letras[n-1] = 65;
}
 
void TerceraLetra(char *Letras, int n)
{
    SegundaLetra(Letras, n);
    Letras[n-2]++;
    if(Letras[n-2] <= 90) TerceraLetra(Letras, n);
    else Letras[n-2] = 65;
}
 
void CuartaLetra(char *Letras, int n)
{
    TerceraLetra(Letras, n);
    Letras[n-3]++;
    if(Letras[n-3] <= 90) CuartaLetra(Letras, n);
    else  Letras[n-3] = 65;
}
 
void QuintaLetra(char *Letras, int n)
{
    CuartaLetra(Letras, n);
    Letras[n-4]++;
    if(Letras[n-4] <= 90) QuintaLetra(Letras, n);
    else Letras[n-4] = 65;
}
 
int main()
{
    char Letras[] = "AAAAA";
    fp = fopen("combinacion.txt", "w");
    QuintaLetra(Letras, 4);
 
    fclose(fp);
    return 0;
}

como puedo acer para que se mezclen los numeros y las letras???
me refiero a que no esten los numeros por un lado y las letras por otro, sino todo en uno...


Título: Re: Como saber todas las combinaciones posibles de letras y numeros?
Publicado por: DickGumshoe en 15 Julio 2012, 01:26 am
Ese código que has puesto fue otro que hice, pero después hice otra versión que no hacía tantas llamadas recursivas (el que he puesto en este tema, en mi primer mensaje).

Para mezclar números y letras tendrías que fijarte en el código ASCII. Empezarías por 00000 (o con tantos caracteres como desees), y vas aumentando (tal y como en el código que te pasé). Cuando uno de los caracteres sea mayor que 9, el carácter en ASCII que le sigue es ':', y lo que quieres es que después del 9 salga la A. Por tanto, haces un condicional en el que si un carácter > 9, carácter == 65. A partir de ahí sigues sumando y ya todo sería como en los códigos del tema que puse.

Espero que te hayas hecho una idea.

Saludos!


Título: Re: Como saber todas las combinaciones posibles de letras y numeros?
Publicado por: nb248077 en 15 Julio 2012, 18:11 pm
resien empiezo a programar en c++
me podrias decir donde iria el condicional y el caracter?


Título: Re: Como saber todas las combinaciones posibles de letras y numeros?
Publicado por: DickGumshoe en 15 Julio 2012, 18:14 pm
resien empiezo a programar en c++
me podrias decir donde iria el condicional y el caracter?

¿A qué te refieres? ¿Es de este tema, o de otro?

Saludos!


Título: Re: Como saber todas las combinaciones posibles de letras y numeros?
Publicado por: nb248077 en 15 Julio 2012, 18:17 pm
de este tema...
es que no se donde iria el condicional y el caracter que le digiste a peterfly con el codigo de peterfly


Título: Re: Como saber todas las combinaciones posibles de letras y numeros?
Publicado por: DickGumshoe en 15 Julio 2012, 18:26 pm
Para empezar tendrías que sustituir

Código
  1. char Letras[] = "AAAAA";

Por:

Código
  1. char Letras[] = "00000";

Para que la primera combinación fuese la 00000.

Y en la función Generador irían las condiciones:

Código
  1. void Generador(char *Letras, int n)
  2. {
  3.    int count, resta=1, llamada;
  4.    while(llamada != 5)
  5.    {
  6.        puts(Letras);
  7.        count = n;
  8.        Letras[n]++;
  9.        llamada = 0;
  10.        while(count >= 0)
  11.        {
  12.            if(Letras[count] == 58) Letras[count] = 65;
  13.            if(Letras[count] > 90)
  14.            {
  15.                Letras[count] = 48;
  16.                Letras[count-1]++;
  17.                llamada++;
  18.            }
  19.            count--;
  20.            resta++;
  21.        }
  22.    }
  23. }


Saludos!