Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * [combr.c]
- * Programa que gera combinações de tamanho r de
- * todos caracteres de uma string de entrada.
- *
- * [Autor]
- * Marcos Paulo Ferreira (Daemonio)
- * undefinido gmail com
- *
- * [Uso]
- * $ gcc -o combr combr.c
- * $ ./combr
- * abcd <-- digite a string
- * 3 <-- digite o r
- *
- * Versão 1.0 by daemonio @ Thu Feb 17 08:17:31 BRST 2011
- * Versão 2.0 by daemonio @ Fri Dec 19 00:27:51 BRST 2014
- * + Aceita entradas com tamanho até 63 posições
- * + Exemplo de entrada para (60, 6):
- * $./ combr
- * abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567
- * 6
- * ..
- * ..
- * (a saida será MUITO longa, em torno de 50kk. Irá demorar bastante)
- * ..
- *
- */
- #include <stdio.h>
- #include <string.h>
- /* para o tipo uint_64 */
- #include <inttypes.h>
- /* Tamanho máximo da entrada */
- #define MAX_INPUT 63
- int main() {
- int64_t MAX, MASK, NUM ;
- int i, j, r, k ;
- /* Armazena a string de entrada. */
- char input[MAX_INPUT] ;
- /* Armazena cada combinação. */
- char str[MAX_INPUT] ;
- printf("Digite o grupo inicial: ") ;
- scanf("%s", input) ;
- printf("Digite o r: ") ;
- scanf("%d", &r) ;
- if(strlen(input) > MAX_INPUT) {
- printf("Erro: entrada muito longa.\n") ;
- return -1 ;
- }
- /* Manda o bit 1 para a n-ésima posição.
- * Os bits são invertidos para que a posição n
- * esteja com o bit zero, a fim de marcar
- * o final do processo.
- */
- MAX = ~((uint64_t)1 << strlen(input)) ;
- /* Primeiro número é o 1. */
- NUM = 1;
- putchar('\n') ;
- /* Quando o número alcançar MAX, o loop
- * será encerrado.
- */
- while ( MAX & NUM ) {
- /* Conta os bits 1's. */
- MASK = 1 ;
- k = 0 ;
- while ( MAX & MASK ) {
- if ( NUM & MASK ) k++ ;
- MASK = MASK << 1 ;
- }
- /* Monta o resultado somente se
- * a quantidade de bits k é igual
- * a r. */
- if ( k == r ) {
- MASK = 1 ;
- i = j = 0 ;
- while ( MAX & MASK ) {
- /* Verdadeiro se NUM tem um bit 1
- * na posição indicada por MASK. */
- if ( NUM & MASK ) {
- /* Gera a combinação em str */
- str[i] = input[j] ;
- i++ ;
- }
- j++ ;
- /* Desloca a máscara */
- MASK = MASK << 1 ;
- }
- str[i]=0 ;
- printf("%s\n", str) ;
- }
- NUM++ ;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement