Advertisement
daemonio

Gerar combinações com palavra de 64 bits

Dec 18th, 2014
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.61 KB | None | 0 0
  1. /*
  2.  * [combr.c]
  3.  * Programa que gera combinações de tamanho r de
  4.  * todos caracteres de uma string de entrada.
  5.  *
  6.  * [Autor]
  7.  * Marcos Paulo Ferreira (Daemonio)
  8.  * undefinido gmail com
  9.  *
  10.  * [Uso]
  11.  * $ gcc -o combr combr.c
  12.  * $ ./combr
  13.  *   abcd <-- digite a string
  14.  *   3    <-- digite o r
  15.  *
  16.  * Versão 1.0 by daemonio @ Thu Feb 17 08:17:31 BRST 2011
  17.  * Versão 2.0 by daemonio @ Fri Dec 19 00:27:51 BRST 2014
  18.  *    + Aceita entradas com tamanho até 63 posições
  19.  *    + Exemplo de entrada para (60, 6):
  20.  *    $./ combr
  21.  *    abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567
  22.  *    6
  23.  *    ..
  24.  *    ..
  25.  *    (a saida será MUITO longa, em torno de 50kk. Irá demorar bastante)
  26.  *    ..
  27.  *
  28.  */
  29.  
  30. #include <stdio.h>
  31. #include <string.h>
  32. /* para o tipo uint_64 */
  33. #include <inttypes.h>
  34.  
  35. /* Tamanho máximo da entrada */
  36. #define MAX_INPUT 63
  37.  
  38. int main() {
  39.     int64_t MAX, MASK, NUM ;
  40.     int i, j, r, k ;
  41.     /* Armazena a string de entrada. */
  42.     char input[MAX_INPUT] ;
  43.     /* Armazena cada combinação. */
  44.     char str[MAX_INPUT] ;
  45.  
  46.     printf("Digite o grupo inicial: ") ;
  47.     scanf("%s", input) ;
  48.  
  49.     printf("Digite o r: ") ;
  50.     scanf("%d", &r) ;
  51.  
  52.     if(strlen(input) > MAX_INPUT) {
  53.         printf("Erro: entrada muito longa.\n") ;
  54.         return -1 ;
  55.     }
  56.  
  57.     /* Manda o bit 1 para a n-ésima posição.
  58.      * Os bits são invertidos para que a posição n
  59.      * esteja com o bit zero, a fim de marcar
  60.      * o final do processo.
  61.      */
  62.     MAX = ~((uint64_t)1 << strlen(input)) ;
  63.  
  64.     /* Primeiro número é o 1. */
  65.     NUM = 1;
  66.  
  67.     putchar('\n') ;
  68.  
  69.     /* Quando o número alcançar MAX, o loop
  70.      * será encerrado.
  71.      */
  72.     while ( MAX & NUM ) {
  73.         /* Conta os bits 1's. */
  74.         MASK = 1 ;
  75.         k = 0 ;
  76.         while ( MAX & MASK ) {
  77.             if ( NUM & MASK ) k++ ;
  78.             MASK = MASK << 1 ;
  79.         }
  80.  
  81.         /* Monta o resultado somente se
  82.          * a quantidade de bits k é igual
  83.          * a r. */
  84.         if ( k == r ) {
  85.             MASK = 1 ;
  86.             i = j = 0 ;
  87.  
  88.             while ( MAX & MASK ) {
  89.                 /* Verdadeiro se NUM tem um bit 1
  90.                  * na posição indicada por MASK. */
  91.                 if ( NUM & MASK ) {
  92.                     /* Gera a combinação em str */
  93.                     str[i] = input[j] ;
  94.                     i++ ;
  95.                 }
  96.                 j++ ;
  97.                 /* Desloca a máscara */
  98.                 MASK = MASK << 1 ;
  99.             }
  100.  
  101.             str[i]=0 ;
  102.             printf("%s\n", str) ;
  103.         }
  104.  
  105.         NUM++ ;
  106.     }
  107.  
  108.     return 0;
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement