## 用C语言实现两组数据组合算法

0

0

ps：第一组和第二组如果只有一个重复数字的话，是不影响你的结果的，这点要注意。

0

“第二组的数据个数可以比第一组的数据多或少”

0

3个和3个组合就是A(3,3) = 6

3个和5个组合就是A(5,3) = 60

4个和1个组合就是A(4,1) = 4

0

#### 引用来自“Grrrr”的答案

3个和3个组合就是A(3,3) = 6

3个和5个组合就是A(5,3) = 60

4个和1个组合就是A(4,1) = 4

p = N(N-1)...(N-n+1)/N的n次方 = A(N,n)/N的n次方。

0

#include<stdio.h>

#include<stdlib.h>

#define FALSE 10000

void pailie(int * a,int * b,int num,FILE * fp);

void printArray(int *a, int len,FILE * fp)

{

for(int i=0;i<len;i++)

fprintf(fp,"%d ",a[i]);

fprintf(fp,"\n");

}

void combine(int * a, int alen,int apos,int *b,int blen,int bpos,FILE *fp)

//void combine(int alen,int blen,int *a,int * b,FILE* fp,int apos,int bpos)

{

if(bpos>=blen) printArray(b,blen,fp);

else

for(int  ai=apos; ai<alen; ai++)

{

b[bpos]=a[ai];

//combine(a,a_len,ai+1,b,b_len,b_pos+1);

//combine(alen,blen,a,b,fp,ai+1,bi+1);

combine(a,alen,ai+1,b,blen,bpos+1,fp);

}

}

int liancheng(int n)

{

int res=1;

for(int i=1;i<=n;i++)

res*=i;

return res;

}

int main()

{

int numOfFirst,numOfSecond;

int i,j,total;

int * firstArray,*secondArray;

freopen("in.txt","r",stdin);

FILE * fp=fopen("selectNum.txt","w+");

FILE * fresult=fopen("result.txt","w+");

printf("input the num of the first array\n");

scanf("%d",&numOfFirst);

firstArray=(int *) malloc(sizeof(int)*numOfFirst);

printf("input the %d elements in the first array\n",numOfFirst);

for(i=0;i<numOfFirst;i++)

{

scanf("%d",&firstArray[i]);

}

printf("input the num of the second  array\n");

scanf("%d",&numOfSecond);

secondArray=(int *) malloc(sizeof(int)*numOfSecond);

printf("input the %d elements in the first array\n",numOfSecond);

for(i=0;i<numOfSecond;i++)

{

scanf("%d",&secondArray[i]);

}

if(numOfFirst<numOfSecond)

{

int a,b,c,total;

a=liancheng(numOfSecond);

b=liancheng(numOfSecond-numOfFirst);

c=liancheng(numOfFirst);

// printf("a=%d,b=%d\n",a,b);

total=a/b/c;

int * btmp=(int*)malloc(sizeof(int)*numOfFirst);

// printf("total =%d\n",total);

//selectNum(numOfFirst,numOfSecond,secondArray,fp);

combine(secondArray,numOfSecond,0,btmp,numOfFirst,0,fp);

fclose(fp);

fp=fopen("selectNum.txt","r");

for(i=0;i<total;i++)

{

for(j=0;j<numOfFirst;j++)

fscanf(fp,"%d",&secondArray[j]);

//                        printf("the second array is \n");

//                        for(j=0;j<numOfFirst;j++)

//                                printf("%d ",secondArray[j]);

//                        printf("\n");

//                // printZuhe(firstArray,secondArray,numOfFirst,fresult);

pailie(firstArray,secondArray,numOfFirst,fresult);

}

}

else if(numOfFirst==numOfSecond)

{

total =1;

for(i=0;i<numOfSecond;i++)

fprintf(fp,"%d ",secondArray[i]);

for(i=0;i<total;i++)

{

for(j=0;j<numOfFirst;j++)

fscanf(fp,"%d",&secondArray[j]);

pailie(firstArray,secondArray,numOfFirst,fresult);

}

}

else

{

//select(numOfSecond,numOfFirst,firstArray);

total=liancheng(numOfFirst)/liancheng(numOfFirst-numOfSecond)/liancheng(numOfSecond);

int *btmp=(int *)malloc(sizeof(int)*numOfSecond);

// selectNum(numOfSecond,numOfFirst,firstArray,fp);

combine(firstArray,numOfFirst,0,btmp,numOfSecond,0,fp);

for(i=0;i<total;i++)

{

for(j=0;j<numOfSecond;j++)

fscanf(fp,"%d",&firstArray[j]);

// printZuhe(firstArray,secondArray,numOfFirst,fresult);

pailie(secondArray,firstArray,numOfSecond,fresult);

}

}

}

void swap (int & a,int & b)

{

int c=a;

a=b;

b=c;

}

void pailie(int * a,int * b,int num,FILE * fp)

{

int i,j,k,x,y;

do

for(i=0;i <num;i++)             //输出排列中的数字

fprintf(fp,"(%d,%d)",a[i],b[i]);

fprintf(fp,"\n");

for( j=num-1;j> 0;j--)       //从右向左;找要交换的位置1(j);

if(b[j]> b[j-1])   break;

if(j==0)break;                   //找不到要交换的位置.退出do

j--;

for(k=num-1;k> j;k--)       //在位置1右边;从右向左;

//找要交换的位置2(k);

if(b[k]> b[j])break;

swap(b[k],b[j]);             //交换位置1和位置2的值;

//把位置1后边的所有位反序排列;

for(x=j+1,y=num-1;x <y;x++,y--)

swap(b[x],b[y]);

}while(1);

}

0

0