问题
输出n个元素的所有子集,如{a,b,c}的子集为{},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}
解决
方法1
如果这些子集用0/1表示的话,可表示为000,001,010,100,110,101,011,111,其中1表示这个元素属于这个子集,0表示不属于。
这种0/1表示法让我想到了数据在内存中的存放也是0/1,所以下面用这种思路解决这个问题。
#include <iostream>
#include <cstring>
using namespace std;
void SubsetGeneration(const char *s)
{
unsigned long long n = 1;
int len = strlen(s);
for(int i = 0;i < len;++i)
n *= 2;
--n;//n个1组成的数等于 2^n-1
for(unsigned long long i = 0;i <= n;++i)
{
unsigned long long temp = i;
cout << i+1 << ‘:‘;
for(int j = 0;j < len;++j)
{
if(temp & 1)//判断s中最前位为1还是0
cout << s[j];
temp >>= 1;//将s往后移动1位
}
cout << endl;
}
}
int main()
{
char a[sizeof(long long)+1];
while(cin >> a)
{
SubsetGeneration(a);
}
return 0;
}
撇开运算效率的问题,这种做法无法解决元素数大于sizeof(long long)