Voy a dejar un post resumen de este tema, muy interesante, queria dejar el mio pero no es tan bueno jaajaj sigo mirando varias cosas. Es practicamente uno que DickGumshoe deja pero trate de corregir la recursividad pero no me funciono muy bien, en fin, dejo las soluciones publicadas.
muy buen post realmente muy bueno
Aqui el primero de DickGumshoe#include <stdio.h>
FILE *fp;
void numeros(char *Letras, int n)
{
int i;
for(i=0;i<100000;i++)
{
fprintf(fp
, "%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);
return 0;
}
Otra solución aportada por BlackZeroX
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
inline string &addWord(string &text) {
string::reverse_iterator it = text.rbegin();
for (; it != text.rend(); it++) {
++(*it);
if (tolower(*it) >= 'a' && tolower(*it) <= 'z') break;
(*it) = (islower(*it))? 'a': 'A';
}
return text;
}
size_t addAllWord(string text, void (*callback)(string&, bool&) = NULL) {
bool cancel = false;
register size_t i = 0, lim = pow(26, text.size());
if (!callback) return lim;
for (;(i < lim) && (cancel ==false); i++) {
callback(addWord(text), cancel);
}
return i;
}
void showWords(string& text, bool& cancel) {
for (register int i = 0; i <= 9999; i++) {
cout << text << setw(4) << setfill('0') << i << endl;
}
}
int main() {
string text = "ZZZx";
cout << addAllWord(text, showWords) << endl;
cin.get();
return 0;
}
Y otra alternativa aportada por xiruko#include <stdio.h>
#define NUM 5 //numero de letras
void cambiar_letras(char* letras, int* pos);
int main(int argc, char** argv)
{
FILE *fd;
char letras[]="AAAAA";
int posLet=0, i;
fd
=fopen("diccionario.txt", "w");
while (posLet < NUM)
{
for (i=0; i<100000; i++)
fprintf(fd
, "%s%.5d\n", letras
, i
);
cambiar_letras(letras, &posLet);
}
return 0;
}
void cambiar_letras(char* letras, int* pos)
{
int i;
for (i=0; i<=*pos && *pos<=NUM; i++)
{
if (letras[i] < 'Z') {
(letras[i])++;
break;
} else {
letras[i]='A';
if ( i==*pos && (letras[i+1]=='A' || letras[i+1]=='\0') )
(*pos)++;
}
}
}
EXCELENTES SOLUCIONES, REALMENTE ESTAN A OTRO NIVEL.