统计子集个数

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值