22、统计子集
1、子集有2^n个 eg: 3一共有8个子集
#include<stdio.h>
#include<math.h>
void powerset(int n) {
int m=pow(2,n);//求出一共多少组不同组合
int subsets[n];//存放子集元素
int nums;
for(int i=0; i<m; i++) { //这个for循环提供多少不同的位不同组合 000、001、010、011....
printf("{");
nums=0;
// j每次判断第j个位置是否匹配,nums统计匹配个数,并且将匹配位置记录在subset数组中
for(int j=0; j<n; j++) { //这个for循环用来判断当前i可以匹配几个 eg:000一个也不会匹配输出{},001可以和001匹配在第一个位置结果为{0}
if(i&(1<<j)) { //eg: 010可以匹配010 1在第二个位置结果为{1},011可以匹配011有两个位置匹配最后集合有两个元素{0,1}
//eg: 111 可以和111匹配有三个元素 结果为{0,1,2}
subsets[nums++]=j;
}
}
//打印输出子集
for(int j=0;j<nums;j++){
printf("%d",subsets[j]);
if(j<nums-1)printf(",");
}
printf("}\n");
}
}
int main() {
int n;
scanf("%d",&n);
powerset(n);
return 0;
}