集合子集问题:
给的一个集合按元素个数列出所有列出所有集合子集,如:
{1,2,3}
0个元素:{}
1个元素:{1},{2},{3}
2个元素:{1,2},{1,3},{2,3}
3个元素:{1,2,3}
输出:{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}
方法:
采用一个二进制数列表示解,如:[000]代表{},[100]代表{1}
算法:
1、一个字符串数组存储解。
2、用一个整形数组存储不同元素个数解应反正字符串数组中得位置。
代码:
#include<iostream>
#include<cmath>
usingnamespace std;
intCOrder(int n,int a)
//排列数,n个中选a个的总数
{
int i,a1=1,a2=1;
for(i=n-a+1;i<=n;i++)
a1*=i;
for(i=2;i<=a;i++)
a2*=i;
return a1/a2;
}
intBitString(int num,char c[],int n)
//将num转换为2进制字符串存储于c中,返回c中'1'的个数
{
int i,k=0;
for(i=n-1;i>=0;i--)
{
if(num%2==0)
{
c[--n]='0';
}
else
{
k++;
c[--n]='1';
}
num/=2;
}
return k;
}
voidBitOrder(int n,char ***c)
{
*c=new char*[pow(2,n)];
//a用于存储不同元素个数的位置
int *a=new int[n],i,k;
a[0]=0;
a[1]=1;
for(i=2;i<=n;i++)
a[i]=a[i-1]+COrder(n,i-1);
for(i=0;i<pow(2,n);i++)
{
char *temp=new char[n+1];
temp[n]=0;
k=BitString(i,temp,n);
(*c)[a[k]++]=temp;
}
}
intmain()
{
char **c;
int n=3;
BitOrder(n,&c);
for(int i=0;i<pow(2,n);i++)
{
cout<<c[i]<<endl;
}
return 0;
}
结果: