先上代码:
#include<iostream>
using namespace std;void print_subset(int n, int s){for(int i=0;i<n;i++)if(s&(1<<i)){printf("%d",i);} printf("\n");}
int main(){int n;cin>>n; for(int i=0;i<(1<<n);i++){print_subset(n,i);if(i!=0)cout<<"#num:"<<i<<endl;}
}
列一下表
S=2时,对应的二进制是10,
那么在void函数的for循环中循环到1<<1时(此时i为1)
s&(1<<i)为1 因此输出1.s=3时,对应的二进制是11,
在void函数的for循环中循环到(1<<0,二进制就是01),
s&(1<<0) 二进制为 01 >0 输出0,
在void函数的for循环中循环到(1<<1,二进制就是10),
s&(1<<1)二进制为10 > 0 输出1后面以此类推
子集是和上面这些数比的,输出的话输出的是i
——————————
s:11(3)
与之做&操作的二进制数: 1 ,10(1<< i,i=0,1)
1(i=0),10 (i=1)
因此当s为3时 输出01
——————————
那么看一下main函数中的循环,i从0到3循环,依次输出:
s:0 输出:换行
s:1 输出:0
s:2 输出; 1
s:3 输出:01
上面说打印(0,1,2.。。。n-1)的子集:
如果打印(1,。。。,n),只需输出i+1