程序思路:

建立数据模型:从m个数中选n个数,被选中和不被选中只有两种状态,这使我们很容易联想到计算机的二进制,0和1。

例如从10个数中选3个的不同组合,10个二进制的1组成的数用十进制表示为1024,那么我们就可以用一个循环产生0到1024和十进制数,然后判断其二进制位有三个为1的数,然后与原数组对应就可得出所有的组合

 

 

#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#define length 8

#define length2 4

int ifn(char a[],int len,int b,int c[]) //二进制字符串,数组总长,抽出的个数,1出现的位置,此函数用于判断符合数组个数的项

{

int count=0;

int i=0;

int j=0;

int f=0;

int cha;

while(a[j] != '\0')

j++;

cha=len-j;

while(a[i] != '\0')

{

if(a[i]=='1')

{

count++;

c[f]=i+cha;

f++;

}

i++;

}

return (count==b)?1:0;

}

 

main()

{

int arr[]={0,1,2,3,4,5,6,7};

int s[50]={0};

char b[500];

int length1=pow(2,length);

int k,j,i;

int c=1;

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

{

itoa(j,b,2);

if((k=ifn(b,length,length2,s))==1)

{

printf("%d:",c++);

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

printf("%d",arr[s[i]]);

printf("\n");

}

}

}