【位运算】 集合的子集输出
问题:怎样找出某个集合的所有子集,怎样找出某个集合指定元素个数的所有子集?
思路:对集合中所有元素进行标记,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; }