#include<cstdio>
#include<iostream>
using namespace std;
void print_subset(int n,int s){
for(int i=0;i<n;i++){
if(s&(1<<i)) cout<<i;
}
if(s!=0)//第一次循环不需要换行
cout<<endl;
}
int main(){
int n=5;//n为集合元素个数 编号从0开始 为0,1,2……n-1
for(int i=0;i<(1<<n);i++)//主算法
print_subset(n,i);
system("pause");
return 0;
}
可加入NumberOf1函数 使输出的子集个数为定值
#include<cstdio>
#include<iostream>
using namespace std;
int NumberOf1(int n){//返回二进制一的个数 注意类型
int count=0;
unsigned int flag=1;//flag从1开始 每次循环左移一位 与n做&运算 判断该位是否为1
while(flag<=n){ //flag大于n 退出循环
if(n&flag)
count++;
flag=flag<<1;
}
return count;
}
void print_subset(int n,int s){
if(NumberOf1(s)==3){//每个子集的个数为3
for(int i=0;i<n;i++)
if(s&(1<<i)) cout<<i;
if(s!=0)//第一次循环不需要换行
cout<<endl;
}
}
int main(){
int n=5;//n为集合元素个数 编号从0开始 为0,1,2……n-1
for(int i=0;i<(1<<n);i++)//主算法
print_subset(n,i);
system("pause");
return 0;
}