求C语言组合函数

来源:百度知道 编辑:UC知道 时间:2024/06/05 11:24:39
在C语言中怎样编写一个函数,使得其可以求出包括任意类型数组的任意个元素打乱顺序后的所有组合的新数组
例如 设 char a[4]={'A','B','C','D'}
求a中的任意3个元素的组合
则结果应为
char b[12]={'A','B','C','A','B','D','A','C','D','B','C','D'}
其实就相当于把一个集合A的元素做一个CMN的组合 这里给定集合A和M、N。哪位大侠能提供给小弟一个算法思路也好啊
注意:是要任意类型的数组 不是只要整型数组

这题目有点意思,本人这两天研究了一下,针对char类型写了一个小程序,测试成功。大概思路是这样的:要做Cmn的组合,可以用一个有n个元素的指针数组,数组中的元素分别指向给定集合中的n个元素,每次取出这些指针所指的值,再按照一定的规律移动指针,如此循环直至结束。下面附上函数源代码及注释,希望对你有所帮助,至于char以外的其它集合,你也不妨试着写写。

void fun(char *strSrc,char *strDes,int n) //strSrc是源数组,strDes是目标数组,n为要选取的个数
{
int i,j,k,len,flag;
char **pp;
char *pSrc,*pDes;
flag=0;
len=strlen(strSrc);
if(n>len)
return;
pSrc=strSrc;
pDes=strDes;
pp=new char*[n];
for(i=0;i<n;i++) //初始时n个指针分别指向前n个数据
pp[i]=pSrc++;
while(1)
{
for(i=0;i<n;i++) //取当前组合数据赋给目标字符串
*pDes++=*pp[i];
*pDes++=' '; //为了看上去方便而加的分隔符
if(flag==1) //若完成则退出
{
*pDes='\0';
break;
}
if( *(pp[n-1]+1)!='\0' ) //若一组中最后一个指针还没有指向源字符串中最后一个数据
pp[n-1]++;
else
{
for(j=n-1;j>0;j--) //从后往前寻找应该移动的指针
{
if(pp[j-1]+1!=pp[j]) //找到指针pp[j-1]
{
//如果该指针为第一个,并且与第二个只隔一个位置,说明