Spark ha scritto:
Grazie alexv.
Ho modificato la mia soluzione in modo da poter decidere anche il numero dei caratteri (LUN).
Mi chiedevo se fosse possibile farlo anche con la soluzione di weirstrass che ad occhio mi sembra la più semplice.
Sentiamo Weirstrass, si dovrebbe fare con la ricorsione, una funzione con un solo ciclo for che richiama sestessa, tante volte quante sono le cifre.
Il codice seguente, funziona con LEN tra 1 e 5, il numero di elementi di Vett può essere arbitrario.
Salva su un file di nome Numeri.txt, e mostra le iterazioni, comodo per controllare l'esattezza del codice.
#include <stdio.h>
#include <stdlib.h>
#define LUN 4 // per usare LUN > 5 bisogna modificare il codice
int power(int base, int exponent);
//algoritmo che genera tutti le combinazioni possibili formati da LUN caratteri
int main(void){
// cambiando il numero di elemnti del vettore Vett, il programma si adegua
char Vett[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
int i,t,n=0, s = sizeof(Vett);
int mass = power(s,LUN); // potenza
int bVett[LUN];
FILE *pFile;
if((pFile=fopen("Numeri.txt", "wt"))==NULL){
printf("Errore nell'apertura del file'");
exit(1);
}
for(i=0; i<mass; i++){
t = i % s;
bVett[0] = Vett[t];
t = (int)i/(s) % s;
bVett[1] = Vett[t];
t = (int)i/(s*s) % s;
bVett[2] = Vett[t];
t = (int)i/(s*s*s) % s;
bVett[3] = Vett[t];
t = (int)i/(s*s*s*s) % s;
bVett[4] = Vett[t];
printf("%06d = %c%c%c%c%c\n",n,bVett[4],bVett[3],bVett[2],bVett[1],bVett[0]);
fprintf(pFile,"%06d = %c%c%c%c%c\n",n,bVett[4],bVett[3],bVett[2],bVett[1],bVett[0]);
n++;
}
fclose(pFile);
return 0;
}
int power(int base, int exponent)
{
int i, s=1;
for (i = 0; i < exponent; ++i)
s *= base;
return s;
}