Advertisement
Guest User

godnames

a guest
Apr 15th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* Program to generate all r-Combinations of a set with distinct element
  2.  * This code is a part of https://phoxis.wordpress.com/2009/10/13/allcombgen/
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8.  
  9. #define MAX 100
  10. #define TRUE 1
  11. #define FALSE 0
  12.  
  13. int generate_combination (const char *source_string,char *combination_string);
  14.  
  15. unsigned int comb_mask = 0x00000001;
  16. unsigned int max_mask_length;
  17.  
  18. /* Main Function, driving generate_combination() */
  19. int main (void)
  20. {
  21.   char combination_string[MAX];
  22.   int len, group_len;
  23.  
  24.   char *source_string ="abcdefghijklmnopqrstuvwxyz";
  25.   group_len = 10;
  26.  
  27.   //printf ("Enter the Source String:");
  28.   //scanf ("%s", source_string);
  29.  
  30.   //printf ("Enter the Group Length:");
  31.   //scanf ("%d", &group_len);
  32.  
  33.   len = strlen (source_string);
  34.   max_mask_length = ~(0x00000001 << len);
  35.  
  36.   //printf ("\nPrinting Combinatins:\n");
  37.   while (1)
  38.     {
  39.       if (generate_combination (source_string, combination_string) == FALSE)
  40.         break;
  41.      
  42.       if(strlen(combination_string)==group_len) printf ("%s\n", combination_string);
  43.     }
  44.   //printf ("\nfinished\n");
  45.   return 0;
  46. }
  47.  
  48. /*
  49.  *  File Name     : combination.c
  50.  *  Function Name : generate_combination
  51.  *  Parameters    :
  52.  *                @ (const char *) source_string
  53.  *                @ (char *)       combination_string
  54.  *  Return Type   : (int)
  55.  *                    # return FALSE if no more mermutations, else return TRUE
  56.  *  Globals       :
  57.  *                @ (unsigned int) comb_mask
  58.  *                    # A bitmask. Used to select unique combinations from source
  59.  *                      string. This function increments and updates this mask
  60.  *                      in each iteration. Each call results in a new permutation.
  61.  *                @ (unsigned int) max_mask_length
  62.  *                    # A bitmask. Used to control the length of masking of
  63.  *                      comb_mask variable. This is not modified in this function.
  64.  *                      Initilized in function main()
  65.  *  Description   : Each call to this function generated a new combination from
  66.  *                  the source_string and then places into combination_string
  67.  *                  The combination is done based upon comb_mask variable. The
  68.  *                  positions, in which comb_mask has a '1' , are only selected
  69.  *                  from the source_string to make a combination.
  70.  *  Note          : The combination generation is comb_mask dependent. To generate
  71.  *                  unique combinations in each call comb_mask should not be modified
  72.  *                  any where else, if some explicit customized combinination is to be
  73.  *                  generated. Each bit field has a fixed length (32bit) , the combintaion
  74.  *                  can be generated is limited to this length, in this version of code.
  75.  *                  This function does not return the null set.
  76.  */
  77.  
  78. int generate_combination (const char *source_string, char *combination_string)
  79. {
  80.   unsigned int mask = 0x00000001;
  81.   int s_pos = 0, c_pos = 0;
  82.  
  83.   /* Main logic */
  84.   while ((mask & max_mask_length))
  85.     {
  86.       if ((comb_mask & mask))
  87.       {
  88.           combination_string[c_pos] = source_string[s_pos];
  89.           c_pos++;
  90.       }
  91.       s_pos++;
  92.       mask <<= 1;
  93.     }
  94.  
  95.   /*update permutation mask */
  96.   comb_mask++;
  97.  
  98.   /* Terminate the combination_string with NULL character */
  99.   combination_string[c_pos] = 0;
  100.  
  101.   /* If combination_string is empty, ie. c_pos == 0 , return FALSE else return TRUE */
  102.   return (c_pos == 0 ? FALSE : TRUE);
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement