【位运算】 集合的子集输出

本文介绍了一种使用二进制编码来生成集合所有子集的算法。通过将集合元素标记为0(未选中)和1(选中),利用二进制编码特性,可以方便地枚举出集合的所有可能子集。文章提供了详细的思路解析和C语言实现代码。

问题:怎样找出某个集合的所有子集,怎样找出某个集合指定元素个数的所有子集?

思路:对集合中所有元素进行标记,0表示未选中,1表示选中。假如有一个集合有3个元素为 {1,2,3}, 则 000 表示一个都不选, 001表示选中数组中第一个元素1,010表示选中数组中第2个元素2,011表示选中数组中第1,2个元素即是1,2...。 这样一来,集合{1,2,3}的所有子集(忽略空集)可以表示为 001 -> 111 这样的编码。这样,我们就知道集合的所有子集的个数,即是 2^3=8个。所以,如果我们需要输出所有的子集,只需要将每个子集用 001这样的二进制编码表示,然后按照此编码输出选中的元素即可。十进制1->7恰可表示为二进制001->111这样的编码,这样求集合的所有子集就很简单了,所有的子集就是: 0->(2^元素数-1) 表示为二进制编码 所对应的集合元素的选择!

 

思路: http://www.cnblogs.com/hdwang/p/6234931.html

代码1:https://www.cnblogs.com/noble/p/4144032.html

代码2:https://blog.youkuaiyun.com/gavingreenson/article/details/52767490

 

 

 #include <stdio.h>  
  
int main()  
{  
        int a[4] = {1, 2, 3, 4};  
        int i, j, k;  
        int t = 1 << 4;  
        for (i = 0; i < t; i++)  
        {  
                j = i;  
                k = 0;  
                printf("{");  
                while (j)  
                {  
                        if (j & 1)  
                        {  
                                printf("%d", a[k]);  
                        }  
                        j >>= 1;  
                        ++k;  
                }  
                printf("}\n");  
        }  
        return 0;  
}  

 

 

转载于:https://www.cnblogs.com/paprikatree/p/10458695.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值