1. 程式人生 > >子集生成方法

子集生成方法

{} ++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)

子集生成方法