N |
N! |
Tiempo |
1 |
1 |
|
2 |
2 |
|
3 |
6 |
|
4 |
24 |
|
5 |
120 |
|
6 |
720 |
|
7 |
5040 |
|
8 |
40320 |
|
9 |
362880 |
|
10 |
3628800 |
3 segundos |
11 |
39916800 |
40 segundos |
12 |
479001600 |
8 minutos |
13 |
6227020800 |
2 horas |
14 |
87178291200 |
1 dia |
15 |
1307674368000 |
2 semanas |
16 |
20922789888000 |
8 meses |
17 |
355689428096000 |
10 años |
/* invierte el orden del array de enteros P * OJO: el elemento '0' del array P *no* se procesa; y P[N] *sí* cuenta */ void reverse (int *P, int N) { int i = 1; while ( i < (N+1-i) ) { swap(&P[i], &P[N+1-i]); i ++; } } int B(int N, int c) { return ( (N % 2) != 0 ? 1 : c ); } /* permutaciones en orden lexicografico; cuenta tambien el total * OJO: el elemento '0' del array P *no* se procesa; y P[N] *sí* cuenta */ void lexperms (int *P, int N, int *total) { int i; int c[N]; for (i = N; i > 1; i --) { c[i] = 1; } i = 2; process(P,N,total); do { if (c[i] < i) { swap(&P[i],&P[c[i]]); reverse(P,i-1); /* inversion parcial! */ process(P,N,total); c[i] ++; i = 2; } else { c[i] = 1; i ++; } } while (i <= N); }
Puedes descargar un programa de ejemplo que usa la función anterior: perm.c. De nuevo, CUIDADO: los arrays con permutaciones que recibe la funcion "process()" van de P[1] a P[N], y encima están invertidos.