子集生成方法
阿新 • • 發佈:2018-02-25
{} ++i ios strlen 表示 post sign cst logs
問題
輸出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)
子集生成方法