Dada uma string qualquer ele calcula todas as permutações possíveis. Sem repetir.
Depois eu explico como o algoritmo funciona, apesar de ser fácil de sacar após ver a saída do programa, explicá-lo e passar para uma linguagem de programação é meio chatinho - ainda mais para alguém como eu que está estudando C há menos 3 meses.
Eu não entendo muito de portabilidade, não sei se ele vai compilar no Windows (fiz no Linux). Então para o pessoal do Linux, compilem com
gcc -O3 -o nomedoprograma nomedafonte.c
...e executem com:
nomedoprograma 'string'
Testei aqui e minha paciência só aguentou até 11 fatorial. Acima disso acho que vai demorar alguns minutos. Seque o código.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
void ordenar(char *str);
int permutar(char *str, int l);
int main(int argc, char *argv[]) {
if ( argc < 2 || argc > 2 ) {
fprintf(stderr, "Saindo..."
exit(1);
}
if ( strlen(*(argv + 1)) < 2 ) {
fprintf(stderr, "0! = 1! = 1\n"
exit(0);
}
char *str = *(argv + 1);
ordenar(str);
printf("%s\n", str);
while ( permutar(str, strlen(str)) ) {
printf("%s\n", str);
}
return(0);
}
void ordenar(char *str) {
int k, j;
char temp;
for ( j = 0; j <= (strlen(str) - 1); ++j ) {
for ( k = 0; k <= (strlen(str) - 1); ++k ) {
if ( *(str + k) > *(str + j) ) {
temp = *(str + k);
*(str + k) = *(str + j);
*(str + j) = temp;
} else {
continue;
}
}
}
}
int permutar(char *str, int l) {
int k = l - 1;
int n = l - 1;
while ( (k > 0) && (*(str + k) <= *(str + (k - 1))) ) {
--k;
}
--k;
if ( k < 0 ) {
return(0);
}
while ( (n > k) && (*(str + n) <= *(str + k)) ) {
--n;
}
char temp = *(str + k);
*(str + k) = *(str + n);
*(str + n) = temp;
--l;
++k;
while ( l > k ) {
temp = *(str + l);
*(str + l) = *(str + k);
*(str + k) = temp;
++k;
--l;
}
return(1);
}