Logo Hardware.com.br
pulsar
pulsar Membro Senior Registrado
342 Mensagens 4 Curtidas

Meu programa de permutações em C

#1 Por pulsar 03/03/2004 - 20:52
Este programa é o resultado de uns 7 ou 6 dias de muito trabalho. Resultado do tópico "algoritmo", que deve estar pela segunda página.

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...&quot;
exit(1);
}

if ( strlen(*(argv + 1)) < 2 ) {
fprintf(stderr, "0! = 1! = 1\n&quot;
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);

}
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal