經典50題之第8題

輸入一變數N , 再輸入N 個數字成為一個含有N 個數的 集合A , 然後輸出所有這個A 集合的子集合。
Ex: N=3, A { 1, 2, 3 }
ANS: { 1 } { 2 } { 3 } { 1, 2 } { 1, 3 } { 2, 3 } { 1, 2, 3 } { } <--- 空集合


解法:
首先先畫如下的表格
abcd
0000 ->
{ }

1000->{a}
0100->{b}
0010->{c}
0001->{d}

1100->{a,b}
1010->{a,c}
1001->{a,d}
0110->{b,c}
0101->{b,d}
0011->{c,d}

1110->{a,b,c}
1101->{a,b,d}
1011->{a,c,d}
0111->{b,c,d}

1111->{a,b,c,d}

你可以將abc看成是一個二進位的字串,1代表有該元素、0代表無該元素
而abc的長度是3,所以二進位的字串長度也是3,從000~111

000代表{}
100代表有第一個元素,所以是{a}

010代表有第二個元素,所以是{b}

001代表有第三個元素,所以是{c}

101代表有第一、三個元素,所以是{a,c}
110代表有第一、二個元素,所以是{a,b}
011代表有第二、三個元素,所以是{b,c}
111代表有第一、二、三元素,所以是{a,b,c}

看出來了嗎?
長度為3的二進位,共有2^3=8種可能
剛好可以表示成你要的狀況,所以你只要將
1. 長度為3的二進位算出來
2. 再將字串裡有1的元素組合出來

就是結果了