在做思维体操时,需要一个高效的组合生成算法。发现之前用PHP写的算法有些问题。修改成如下的代码,其中第一个参数是存储产生组合的数组,每次调用该参数会利用数组返回相应的组合,同时返回是否成功产生组合的标志。
最后编辑: Robin Hoo 编辑于2008/09/22 20:37
C语言: 组合生成的高效算法
01 int combination(unsigned int **intArr,unsigned int m,unsigned int n)
02 {
03 int i,index;
04 if ((*intArr)==NULL)
05 {
06 (*intArr)=(unsigned int *)malloc(m*sizeof(unsigned int));
07 for(i=0;i<m;i++) (*intArr)[i]=i+1;
08 return 1;
09 }
10 index=m-1;
11
12 while(n-(*intArr)[index]<=m-index-1 && index>=0)
13 {
14 index--;
15 }
16 if (index>=0)
17 {
18 for(i=index;i<m;i++)
19 {
20 (*intArr)[i]++;
21 if(i<m-1) (*intArr)[i+1]=(*intArr)[i];
22 }
23 return 1;
24 }
25 free((*intArr));
26 (*intArr)=NULL;
27 return 0;
28 }
02 {
03 int i,index;
04 if ((*intArr)==NULL)
05 {
06 (*intArr)=(unsigned int *)malloc(m*sizeof(unsigned int));
07 for(i=0;i<m;i++) (*intArr)[i]=i+1;
08 return 1;
09 }
10 index=m-1;
11
12 while(n-(*intArr)[index]<=m-index-1 && index>=0)
13 {
14 index--;
15 }
16 if (index>=0)
17 {
18 for(i=index;i<m;i++)
19 {
20 (*intArr)[i]++;
21 if(i<m-1) (*intArr)[i+1]=(*intArr)[i];
22 }
23 return 1;
24 }
25 free((*intArr));
26 (*intArr)=NULL;
27 return 0;
28 }
最后编辑: Robin Hoo 编辑于2008/09/22 20:37
0 comment(s)



September 22, 2008 @ 20:21,
文章来自: 本站原创
Tags:
[转帖]暗恋姚明6年之久的澳洲女篮中锋劳伦杰克逊给姚明的情书的中文翻译
并发并可控制的AjaxObject类

