输出n个元素的集合所有的子集,如{a,b,c}的子集就有{},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}。
/*
对于集合{A,B,C,D},它的非空子集个数为2×2×2×2-1,用二进制表示就是1111,我们规定从左到右第1位对应A,
第2位对应B,第3位对应C,第4位对应D。如果相应位为1,则表示存在该字符,否则不存在该字符。如1101就表示{A,B,D}。
这样,对于一个n个字符组成的集合,根据n可以算法它的非空子集个数为m(2的n次幂-1),将m转换为二进制数,然后采用每次减1的方法,即可得到所有子集。
*/
void SubSets(const char* str)
{
int len = strlen(str);
for(int i = 0; i < (1<<len); i++) //2^len 个子集
{
cout<<"{ ";
//判断数i的二进制中第1<<j位是否为1
for(int j = 0; j < len; j++)
{
if( (i&(1<<j) ) != 0)
{
cout<<str[j];
}
}
cout<<" }"<<endl;
}
}
int main()
{
constchar *str ="abc";
SubSets(str);
system("pause");
}