1. 递归求解
/*pArr为输入的字符串,i为正在处理的字符,pResult为存储结果,num统计共有多杀个幂集*/
void powerSet(char *pArr, int i, char *pResult, int &num)
{
char tempArr[MAX_LENGTH];
strcpy(tempArr, pResult);
if (i >= strlen(pArr))
{
printf("{%s}/n", pResult);
num++;
}
else
{
powerSet(pArr, i+1, tempArr, num);
strncat(tempArr, (pArr+i), 1);
powerSet(pArr, i+1, tempArr, num);
}
}
int main()
{
char *pstr = "ABC";
char *pres = new char[MAX_LENGTH];
memset(pres, 0, sizeof(char)*MAX_LENGTH);
int num = 0;
powerSet(pstr, 0, pres, num);
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangyangkobe/archive/2010/10/10/5931480.aspx#
2. 利用二进制与幂集的关系
/*
二进制法求一个集合的幂集
作者:blackmanba
时间:2010年10月10日
*/
/*x的二进制表示可以用来表示s的一个子集:对于x的第i位,如果为1,则此子集包含s的第i个元素,否则不包含。
因此,只要遍历 [0,2^n)的整数区间,就能列举出s的所有子集,这些子集的集合就是s的幂集*/
/*arr为输入的字符串,n为该数组的元素个数, result为存储结果的字符串数组*/
void powerSet(char *arr, int n, char* result[])
{
int max_length = 2<<(n-1);//幂集的最大个数
for (int i=0; i<max_length; i++)
{
string temp = "";
for (int j=0; j<n; j++)
{
if (i & (1<<j))//判断每一个i的二进制中哪一位是1,若为1,将对应的位选中
{
temp += *(arr+n-j-1);
}
}
strcpy(result[i], temp.c_str());
}
}
int main()
{
char *arr = "ABC";
char *res[8];//n为"ABC"幂集的个数
for (int i=0; i<8; i++)
{
res[i] = new char[4];
}
powerSet(arr, 3, res);
for (int i=0; i<8; i++)
{
printf("{%s}/n", res[i]);
}
//释放内存
for(int i=0; i<8; i++)
{
delete []res[i];
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wangyangkobe/archive/2010/10/10/5931480.aspx#