二进制法生成1-n的子集

先上代码:

#include
using namespace std;

void print_subset(int n, int s){
    for(int i=0;iif(s&(1<printf("%d",i);

        } 
        printf("\n");

}
int main(){
    int n;
    cin>>n; 
    for(int i=0;i<(1<if(i!=0)cout<<"#num:"<

二进制法生成1-n的子集_第1张图片

列一下表
二进制法生成1-n的子集_第2张图片

S=2时,对应的二进制是10,
那么在void函数的for循环中循环到1<<1时(此时i为1)
s&(1<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


后面以此类推

二进制法生成1-n的子集_第3张图片

子集是和上面这些数比的,输出的话输出的是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

你可能感兴趣的:(acm练习(c++/c))