Toutes les possibilités de n caractères

Fermé
fmpfp - 1 août 2013 à 14:08
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 - 7 août 2013 à 13:54
Bonjour,
je cherche à faire un programme JAVA qui ferait toutes les possibilités de n caractères. En fait j'ai déjà un tableau avec a, b, c, d jusqu'à z et j'aimerais écrire si n=1:
a
b
c
...
z
si n=2
a
b
c
....
z
aa
ab
ac
ad
...
az
ba
bb
bc
bd
...
bz
...
zz
merci bcp de votre aide

A voir également:

4 réponses

Bien Reçu votre problème est très intéressant moi aussi je suis débutant avec java mais j'ai un bon niveau en language C t'inquiète je vais trouver une solution et je vais communiquer la solution avec toi reste a jour sur la page ;)
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
3 août 2013 à 08:27
Tu pourrais utiliser le code que j'avais mis ici : Permutations d'éléments de matrice
Il faudra juste faire une classe de test qui correspond à tes besoins.
0
J'ai Résolue ton problème en 2 classe :
classe1.java qui met tout les probabilité possible dans une LinkedList
classe2.java qui demande a l'utilisateur d'entrer le nombre n puis fait appelle a classe1 et met le contenut de la list dans un fichier resultat

classe1.java
{
public class Prob {

public void longueur(int n){
int longueur = 0 ;
for(int i=n;i>0;i--){
longueur+=java.lang.Math.pow(26, i);
}
Res = new ArrayList(longueur);}

public int getNbrLigne(int n,int NbrL){
NbrL=1;
for(int i=0;i<n;i++){
NbrL*=26;
}
return NbrL;
}
public int remplirList(int nbrl,int j,int n,int in,char[] lettre){
int lettrewait = 1;
int i;
for(i=0;i<n-in;i++){
lettrewait*=26;
}

int comptl=0;
int anc=j;
i=0;

while(j<nbrl+anc){

if(comptl<lettrewait){
if(i>25){i=0;}
try{
Res.set(j, ""+Res.get(j)+lettre[i]);}
catch(Exception e){Res.add(lettre[i]);}
comptl++;
}
else{comptl=0;
i++;
if(i>25){i=0;}
try{Res.set(j, ""+Res.get(j)+lettre[i]);}
catch(Exception e){Res.add(lettre[i]);}comptl++;}
j++;
}

return j;
}
public void resultat(int n){
char[] lettre={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int k=1;
int nbrl=1;
int j=0;
int aide=0;
this.longueur(n);
while(k<=n){
nbrl=this.getNbrLigne(k,nbrl);

int in=1;
while(in<=k){

j=this.remplirList(nbrl, aide,k, in, lettre);
in++;
}

aide=j;

k++;
}
}

List Res;

}
}
classe2.java c'est la classe main
{
public static void main(String[] args) {
int i;
Scanner sc = new Scanner(System.in);
System.out.println("Veuillez Entrez un numero :");
int n = sc.nextInt();
Calc tab = new Calc();
tab.resultat(n);
File f = new File ("resultat.txt");

try
{
PrintWriter pw = new PrintWriter (new BufferedWriter (new FileWriter (f)));

for(i=0;i<tab.Res.size();i++){
pw.println(tab.Res.get(i));
}
pw.close();
}
catch(Exception e){}
}
}

Ca marche très très bien il suffit de tester ,mais je peut pas vous expliquez le code dans un commentaire
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
3 août 2013 à 16:12
Dans le cas présent, utiliser une LinkedList n'est pas très utile: on a pas besoin de ses fonctionnalités, d'autant plus que tu la boxes dans une interface List simple.
Utilise un ArrayList à la place, et pour accélérer le tout, précise à l'avance la taille de la List comme ceci:
public void resultat(int n){
    Res = new ArrayList(java.lang.Math.pow(26, n));
Comme ça java n'a pas à agrandir la liste à chaque fois.
0
Merci Gravgun pour votre aide, mais la longueur n'est pas 26 à la puissance n mais 26^n +26^n-1+...+26^1.
car il veut pour n = 2 ; a b c d .... z aa ab ....ba bb ............... za zz
Ben j'ai modifié le code vérifier svp est ce que c ça
Et comme j'ai signalé au début je suis un débutant en java et j'espère améliorer mon niveau avec vous donc si vous avez d'autre remarques ou d'autre conseilles n'hésiter pas

Cordialement
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
3 août 2013 à 16:40
Le code est correct, j'affirme. Bonne idée de faire une fonction pour le calcul de longueur d'ailleurs, c'est plus propre.
0
;)
0
kij_82 Messages postés 4088 Date d'inscription jeudi 7 avril 2005 Statut Contributeur Dernière intervention 30 septembre 2013 857
Modifié par kij_82 le 7/08/2013 à 13:56
Bonjour,

S'il ne s'agit que d'afficher les résultats, je pense qu'une fonction récursive reste le plus simple:


public class TestLoop {

    public static char[] LETTERS = new char[]{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};


   private static void treatLoop(int loopNumber, String base){

      int iter = 0;
      while(iter < LETTERS.length){
         if (loopNumber <= 1){
 System.out.println(base.concat(String.valueOf(LETTERS[iter])));
         } else {
 treatLoop(loopNumber - 1, base.concat(String.valueOf(LETTERS[iter])));
         }

         iter++;
      }
   }

   public static void main(String[] args){
      int nbLoop = 5;
      treatLoop(nbLoop , "");
   }
}


Libre ensuite d'adapter, mais un conseil, le nombre de possibilités étant relativement grand, ne prévoyez pas de stocker les résultats sans risque d'exploser votre mémoire. Sinon au lieu d'écrire sur la sortie standard vous pouvez adapter pour écrire dans un fichier, par exemple.


~ N'oubliez pas la balise "Résolu" lorsque votre problème est... résolu :) ~
0