Falls das Problem noch aktuell ist, hier meine Lösung in C.
Eingegeben wird die Anzahl der zu permutierenden Zeichen (N)
und die Nummer der auszugebenden Permutation (n).
Beispiel mit N = 5, n = 1
#1: 12345
Beispiel mit N = 5, n = 120
#120: 54321
Beispiel mit N = 3, n = 0
#1: 123
#2: 132
...
#6: 321
Beispiel mit n = 12, n = 100000
#100000: 12368AB59704
Der Code ist einfach gehalten und berechnet die faktorielle Darstellung für jede Permutation neu.Code:#include <stdio.h> #include <string.h> #define DIGITS "1234567890ABCDEF" int print_perm (unsigned int N, unsigned int n0) { char *l, letters[] = DIGITS; int j, digit[N]; unsigned int n = n0; // n0 in faktorielle Darstellung umwandeln for (unsigned int i = 1; i <= N; i++) { digit[i-1] = n % i; n /= i; } if (n) return 0; // n0-te Permutation ausdrucken printf ("#%d: ", n0 + 1); for (int i = N-1; i >= 0; i--) { for (j = -1, l = letters - 1; j < digit[i]; j += *++l != ' '); printf ("%c", *l); // Gedruckte Zeichen aus Liste entfernen *l = ' '; } printf ("\n"); return 1; } int main () { unsigned int n, N; printf ("\nAnzahl Zeichen: "); scanf ("%u", &N); printf ("\nPermutation Nr. (0 fuer alle): "); scanf ("%u", &n); if (N == 0 || N > strlen (DIGITS)) { printf ("Ungueltige Eingabe: Anzahl Zeichen in 1..%d\n", strlen (DIGITS)); return 1; } if (n) print_perm (N, n-1); else while (print_perm (N, n++)); return 0; }
Für eine effiziente Implementierung falls alle Permutationen gebraucht werden oder nur eine Teilmenge aus einer Obermenge auszuwählen ist, kann man eine Arithmetik auf der faktoriellen Darstellung implementieren.









Lesezeichen