#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;
}