Como saber todas las combinaciones posibles de letras y numeros?

Iniciado por peterfly, 13 Julio 2012, 21:58 PM

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

peterfly

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.

DickGumshoe

¡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:

#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);
}

void Generador(char *Letras, int n)
{
   int count, resta=1, llamada;
   while(llamada != 5)
   {
       numeros(Letras, n);
       count = n;
       Letras[n]++;
       llamada = 0;
       while(count >= 0)
       {
           if(Letras[count] > 90)
           {
               Letras[count] = 65;
               Letras[count-1]++;
               llamada++;
           }
           count--;
           resta++;
       }
   }
}
int main()
{
   char Letras[] = "AAAAA";
   fp = fopen("combinacion.txt", "w");
   Generador(Letras, 4);
   fclose(fp);
   return 0;
}


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!

0xDani

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 :-\
I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM

peterfly

muchas gracias amigos...

pero una duda..

con el código sacado del enlace que me pasaste:
#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...

DickGumshoe

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!

nb248077

resien empiezo a programar en c++
me podrias decir donde iria el condicional y el caracter?

DickGumshoe

Cita de: nb248077 en 15 Julio 2012, 18:11 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!

nb248077

de este tema...
es que no se donde iria el condicional y el caracter que le digiste a peterfly con el codigo de peterfly

DickGumshoe

Para empezar tendrías que sustituir

char Letras[] = "AAAAA";

Por:

char Letras[] = "00000";

Para que la primera combinación fuese la 00000.

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

void Generador(char *Letras, int n)
{
    int count, resta=1, llamada;
    while(llamada != 5)
    {
        puts(Letras);
        count = n;
        Letras[n]++;
        llamada = 0;
        while(count >= 0)
        {
            if(Letras[count] == 58) Letras[count] = 65;
            if(Letras[count] > 90)
            {
                Letras[count] = 48;
                Letras[count-1]++;
                llamada++;
            }
            count--;
            resta++;
        }
    }
}



Saludos!