1、递归求解 // Virtual.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include <iostream> using namespace std; /* 求幂积最简单的算法思想就是从最后一个元素倒着来遍历所有元素,比如说最后一个就是自己"c" ; 倒数第二个:首先把自己和幂积里面已有的所有元素做乘积("bc"),然后加到幂积里,此时为{c,bc};最后再加上自己"b",{b,c,bc} 倒数第三个:把自己(a)和幂积中所有元素做乘积{ab,ac,abc},加到幂积集合中,此时幂积中为:{b,c,bc,ab,ac,abc};最后再加上自己本身"a",为:{a,b,c,bc,ab,ac,abc}. */ #define MAX_LENGTH 100 //幂集的最大个数 /*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); } 2、 利用二进制数与幂集之间的对应关系 // Virtual.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include <iostream> #include <string> using namespace std; /* 二进制法求一个集合的幂集 作者: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]; } }