D 的个人博客

全职做开源,自由职业者

  menu

C语言实现排列/组合算法

/* 
*  文件名:Permutation.c
*  用途:全排列算法
*  编程环境:WinXP SP2+CL 8.0
*  完成日期: 2006.2   Ver 0.01
*  作者: 88250
*  联系方式: E-mail: DL88250@gmail.com  QQ:845765
*/

#include 
<stdio.h>

#include 
<stdlib.h>



int count = 0;



void permutation(char per[], int m, int len) 

{    

    
int i; 

    
char tmp;



    
if (m < len - 1){

        permutation(per, m 
+ 1, len);

        
for (i = m + 1; i < len; i++){

            
/* 选当次的排列“头” */

            tmp 
= per[m];

            per[m] 
= per[i];

            per[i] 
= tmp;

            permutation(per, m 
+ 1, len);

            
/* 恢复上一次的排列 */

            tmp 
= per[m]; 

            per[m] 
= per[i];

            per[i] 
= tmp;

        }

    }
else{

        
++count;        /* 对排列进行计数 */

        
/* 调整一下格式^^ */

        printf(
"%s ", per);

    } 

    
return;



int main(void



    
int i = time(NULL);    

    
char per[] = "ABCD"



    permutation(per, 
0, strlen(per));

    printf(
"The total: %d" , count);

    

    
return 0

}

/* 
*  文件名:Combination.c
*  用途:组合算法
*  编程环境:WinXP SP2+CL 8.0
*  完成日期: 2006.2   Ver 0.01
*  作者: 88250
*  联系方式: E-mail: DL88250@gmail.com  QQ:845765
*/

#include 
<stdio.h>



#define MAX_NUM 20



int comb[MAX_NUM];



void combination(int m, int n)

{

    
int i, j;

    

    
for (i = m; i >= n; i--){

        comb[n] 
= i;        /* 选择当前的“头”元素 */

        
if (n > 1){

            
/* 进入下一次更小的组合问题 */

            combination(i 
- 1, n - 1);

        }
else{

            
/* 满了需要的组合数,输出 */

            
for (j = comb[0]; j > 0; j--){

                printf(
"%c", comb[j] + 64);

            }

            printf(
" ");

        }

    }



    
return;

}



int main(int argc, char *argv[])

{



    comb[
0= 2;

    combination(
4, comb[0]);        /* C(4, 2) */



    
return 0;

}