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

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

思路:对集合中所有元素进行标记,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.csdn.net/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;  
}  

 

 

posted on 2019-03-01 20:49  时间静止之湖  阅读(285)  评论(0编辑  收藏  举报

导航