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
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
A voir également:
- Toutes les possibilités de n caractères
- Caractères ascii - Guide
- Caractères spéciaux symboles clavier - Guide
- Caractères spéciaux - Guide
- Clavier mac caractères spéciaux - Guide
- Exemple de mot de passe à 8 caractères - Guide
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 ;)
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
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.
Il faudra juste faire une classe de test qui correspond à tes besoins.
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
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
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
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:
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.
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
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
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
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.
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
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:
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 :) ~
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 :) ~