程序思路:
建立数据模型:从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");
}
}
}
转载于:https://blog.51cto.com/ziyouwuzhe/1181370