⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 permute1.c

📁 国外网站上的一些精典的C程序
💻 C
字号:
#include<stdio.h>#include<stdlib.h>#include<string.h>/*  chouse_n ( char *strng, int length) returns a pointer to a string of   *//*  length characters chosen from "strng" , duplicate chars in "strng" are *//*  significant.  Strings are generated in lexical order.                  *//*  First call, call with *strng. each subsequent call, call with NULL,    *//*  returns one combination. Calls after all combinations have been        *//*  returned return NULL.  Will return NULL for errors.                    *//*  not very defensive (i.e. WILL BREAK)                                   *//*  dave chapman aug '91  released to public domain                        */char *chouse_n( char *strng, int length);char *chouse_n( char *strng, int length){      static char *str;      static char *curr;      static char *pos;       /* for each char in curr(ent string),                                 its pos in str                            */      static int  counts[256];      int i,j;      if (0 >= length)            return NULL;      if (NULL != strng)      {            str = malloc(strlen(strng)); /* first call, prep string for use */            curr = malloc(2 * length + 1);            pos = curr + length +1;            for (i = 0; i < 256; counts[i++] = 0)                  ;            for (i = 0; strng[i]; i++)                  counts[strng[i]]++;            for (i = 1, j = 0; i < 256; i++)            {                  if (counts[i])                  {                        str[j] = i;                        counts[j++] = counts[i];                  }            }            str[j] = '\0';      /* str is string of distinct chars in order */                                /* counts[] holds count of each char        */            /* take first length chars */            for (i = 0,j = 0; i < length; i++)            {                  curr[i] = str[j];                  pos[i] = j;                  if (!(--counts[j]))                        j++;            }            curr[i] = '\0';            return curr;      }      /* if called with "mississippi",5;         str -> "imps"         curr -> "iiiim"         counts -> 0,0,2,4;         pos -> 0,0,0,0,1;   */            /* go back to front */      for (j = length; j > 0;)      {            counts[ pos[--j]]++;                      /* "replace" char */            /* look for a new char for curr posit. */            for ( i = ++pos[j]; str[i] && ! counts[i]; i++)                  ;            if (0 != (curr[j] = str[i]))              /* found a char   */            {                  --counts[i];                  pos[j] = i;                  /* placed char, fill out rest of string  */                  for (++j, i = 0; j < length; j++)                  {                        for ( ; !counts[i]; i++)                              ;                        curr[j] = str[i];       /* first available char */                        --counts[i];                        pos[j] = i;                  }                  return curr;            }            /* no more chars for this pos ; go back one */      }      /*  done */      return NULL;}main(){      char  *str = "aabbccdd";      int i,j;      j = 0;      i =  5;      puts(chouse_n( str, i));      while (NULL != (str = chouse_n(NULL, i)))      {            ++j;            printf(" %s  %d\n",str,j);      }      return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -