Salut salut.
Pour ma part, je suis plus intéressé par l'algorithme qu'autre chose ; de plus, je voulais faire un nouveau sujet mais celui-ci a toujours lieu d'être malgré les vieilles réponses, donc allons-y...
Ce que j'ai pu faire en C, c'est une fonction récursive - enfin, plus une procédure puisqu'elle ne retourne pas de valeur - qui reçoit un argument un nombre allant de 0 à n, et qui va appeler printf() plusieurs fois pour afficher un caractère à la fois. Je m'explique :
char tab[] = "0123456789";
Le but sera de faire afficher de 0 à 9, puis de 00 à 99, puis de 000 à 999... etc, jusqu'à une taille donnée (je ne me suis pas encore penché sur la condition d'arrêt).
J'ai donc employé l'usage d'un compteur.
Et j'ai pensé aux conditions suivantes :
si cpt = 0, retourner 0
si cpt = 9, retourner 9
par contre, si cpt = 10, retourner "00"
si cpt = 11, retourner "01
...
si cpt = 20, retourner "10"
...
si cpt = 100, retourner "90"
si cpt = 110, retourner "000"
L'algorithme appellera donc la division et le modulo :
- Les divisions successives pour connaître la taille de la chaîne courante en fonction du compteur ;
- Le modulo pour connaître le caractère en question dans la table.
Enfin, je vous avoue que j'ai vraiment du mal à m'expliquer car entre le repas et la douche, j'ai réfléchi à plusieurs trucs sans garder les traces de mon boulot ; cet algo est vraiment casse-tête...
Néanmoins, j'ai trouvé une fonction récursive qui marchait :
Procedure BruteForce(E : num : Entier, E : tab : chaine de catactères : E : taille : Entier)
Debut
Si num / taille = 0 Alors
Afficher tab[num]
Sinon
Executer BruteForce((num/longueur)-1 ,tab, taille)
Afficher tab[(num%longueur)]
FinSi
Fin
En C :
void BruteForce(size_t num, char *tab, int longueur) {
if(!(num / longueur)) {
printf("%c",tab[num]);
} else {
BruteForce((num/longueur)-1,tab,longueur);
printf("%c",tab[(num%longueur)]);
}
}
Bien que je ne puisse réexpliquer mon raisonnement, ce code marche parfaitement dans une boucle comme celle-ci - je rappelle que je n'ai pas fait de condition d'arrêt :
i <- 0
Tant que 1 Faire
Executer BruteForce(i, tab, LongueurTab)
Afficher "\n"
i <- i + 1
Fin Tant que
while(1) {
BruteForce(i,tab,LongueurTab);
printf("\n");
i++;
}
Bref, ça commence à me prendre un peu la tête, tout ça...
Je voulais savoir si quelqu'un saurait comment me traduire cette fonction en itérative qui retournerait la bonne chaîne de caractères ? Car j'avoue que je stagne là.
Si vous avez besoin de plus de précisions sur la chose, j'essaierai de faire de mon mieux.