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
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;
}
Der Code ist einfach gehalten und berechnet die faktorielle Darstellung für jede Permutation neu.
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