#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int count=0;

/*
 * 加1后进位操作 
 * 用字符串模拟数字的进位操作
 */
void add_one(int *array, int array_len, int radio, int *flow)
{
        int i;
        for ( i=array_len-1; i>=0; i-- )
        {
                array[i] += 1;
                //没有进位就退出
                if (array[i] < radio) return; else array[i] = 0;                        
        }
        // 最高位溢出 - 标志进位操作已经结束
        (*flow) = 1;
}

/*
 * 获取全排列 
 */
int get_pailie(char *set, int set_len, int sub_len, char *out, int out_len)
{
        int  end_flag = 0;
        int *array    = NULL;
        int  i = 0;
        if ( NULL==set || NULL==out || out_len<sub_len ) return -1;
        if ( (array=(int *)malloc(sub_len * sizeof(int))) == NULL ) return -2;
        // 初始化整数集合为0
        for( i=0; i<sub_len; i++ )  array[i] = 0;
        while( 1 != end_flag )
        {
                for(i=0; i<sub_len; i++)out[i] = set[array[i]];// 输出结果的每一位与它对应的数的每一位相同
                printf("%9s", out);
				if(count%8==0) printf("\n");
				count++;
				// 下标+1
                add_one(array, sub_len, set_len, &end_flag);
        }
        free(array);
        return 0;
}

int main(void)
{
        char *set="ACGT";
        char  out[9] = {0};
        int   set_len = 4;
        int   sub_len = 8;
        get_pailie(set, set_len, sub_len, out, sub_len);  //用这4字基本字符组合成8位字符串
                                                          //共有65536对组合
		printf("\n共有组合(含重复数据)%d组\n",count);
        return 0;        
}