Piszę program wypisujący w konsoli wszystkie permutacje danego ciągu znaków. Działa dla ciągu o długości do 7, przy 7 program się zawiesza, prawdopodobnie przez Stack Overflow. Sam nie dałem rady znaleźć przyczyny tego błędu, może Wam się uda :)
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef unsigned short uint16;
typedef unsigned int uint32;
typedef unsigned long uint64;
double silnia(uint16 n) {
if (n == 0 || n == 1) return 1;
else if (n == 2) return 2;
else return n*silnia(n-1);
}
void odbij(uint16 from, char str[], uint16 size) {
//lustrzane odbicie tablicy char ( abc -> cba )
char tmp[size];
int i = 0;
for (i = from; i < size; i++)
tmp[from+size-i-1] = str[i];
for (i = from; i < size; i++)
str[i] = tmp[i];
}
void permutuj(char basket[], uint16 size, double n, double koniec) {
//generowanie permutacji zbioru, wykorzystuje Algorytm Dijkstry
if (n == 0)
{
//pierwsza permutacja (ten sam zbior)
printf("%s\n", basket);
permutuj(basket, size, n+1, koniec);
}
else if (n != koniec)
{
int i = 0;
for (i = size-2; i >= 0; i--)
{
//poszukiwanie (od prawej storny) pierwszego elemntu mniejszego niz element wczesniejszy
if (basket[i] < basket[i+1])
{
int j = 0;
for (j = size-1; j >= 0; j--)
{
if (basket[j] > basket[i])
{
char tmp = basket[j];
basket[j] = basket[i];
basket[i] = tmp;
break;
}
}
break;
}
}
odbij(i+1, basket, size);
printf("%s\n", basket);
permutuj(basket, size, n+1, koniec);
}
}
int main(void) {
printf("\n\t>>> PERMUTACJE <<<\n\n> ");
char str[] = "12345678";
printf("%s", str);
printf("\n\nRezultat: \n");
permutuj( str, strlen(str), 0, silnia( strlen(str) ) );
return 0;
}
<<17
byłoby chyba czytelniejsze niż*131072
, bo w pierwszym widać że chodzi o przesunięcie, a w drugim nie dla każdego jest oczywiste, że to okrągła potęga dwójki.