| [Précédent] |
| 3.9 |
Permutations et combinaisons - Corrigé | Niveau 2 |
||
Fichiers: |
CombiPermu.java, CombiPermu2.java | |||
La façon intuitive de coder ce programme donne une solution ressemblant à celle-ci :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
public class CombiPermu {
public static void main(String[] args) {
/* Formule mathématique de la permutation de k
* élements parmi n: (n!)/(n-k)!
* Formule mathématique de la combinaison de k
* élements parmi n: (n!)/(k!*(n-k)!)
*/
//valeurs à définir
int n = 10;
int k = 6;
int n_factorial = 1;
int k_factorial = 1;
int n_minus_k_factorial = 1;
//calcul des factoriels
for (int i = 1; i <= n; i++) {
n_factorial *= i;
}
for (int i = 1; i <= k; i++) {
k_factorial *= i;
}
for (int i = 1; i <= (n - k); i++) {
n_minus_k_factorial *= i;
}
//permutations
System.out.println("Le nombre de permutations de " + k
+ " elements parmi " + n + " est "
+ (n_factorial / n_minus_k_factorial));
//combinaisons
System.out.println("Le nombre de combinaisons de " + k +
" elements parmi " + n + " est "
+ (n_factorial / (k_factorial*n_minus_k_factorial)));
}
} |
Selon les valeurs de n et k les trois boucles calculant les factorielles font des calculs redondants.
Une version du code essayant d'éviter ces redondances serait :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
public class CombiPermu2 {
public static void main(String[] args) {
// valeurs à définir
int n = 10;
int k = 6;
int n_factorial, k_factorial, n_minus_k_factorial;
n_factorial = 1;
k_factorial = 1;
n_minus_k_factorial = 1;
//calcul amélioré des factoriels
if (k < (n - k)) {
for (int i = 1; i <= k; i++) {
k_factorial *= i;
}
n_minus_k_factorial = k_factorial;
for (int i = k + 1; i <= (n - k); i++){
n_minus_k_factorial *= i;
}
n_factorial = n_minus_k_factorial;
for (int i = (n - k) + 1; i <= n; i++){
n_factorial *= i;
}
} else {
for (int i = 1; i <= (n - k); i++){
n_minus_k_factorial *= i;
}
k_factorial = n_minus_k_factorial;
for (int i = (n - k) + 1; i <= k; i++){
k_factorial *= i;
}
n_factorial = k_factorial;
for (int i = k + 1; i <= n; i++){
n_factorial *= i;
}
}
//permutations
System.out.println("Le nombre de permutations de " + k
+ " élements parmi " + n + " est "
+ (n_factorial / n_minus_k_factorial));
//combinaisons
System.out.println("Le nombre de combinaisons de " + k
+ " élements parmi " + n + " est "
+ (n_factorial / (k_factorial*n_minus_k_factorial)));
}
} |
| [Précédent] |