枚举一个集合的所有有效子集


#include 

using namespace std;

//输出十进制对应的二进制数(模板)
void print(int n) {
    printf("%d:", n);
    //输出4个数位的二进制数
    for (int i = 3; i >= 0; i--)
        printf("%d", n >> i & 1);
    printf("\n");
}

int main() {
    int i = 13;//1101 ,注意:只有一个数位是1的数字,是没有有效子集的!!
    /**
     这个就是按二进制位去算,你可以按代码手动模拟一下。
     比如 i = (1101)2 的时候,S 就会枚举到:1101、1100、1001、1000、0101、0100、0001、0000 这 8 种情况,
     其中1101和 0000是无意义的,不列入其中,我们只讨论有效的子集,那就是有6个:
     1100、1001、1000、0101、0100、0001
    */
    //获取指定数字i的所有有效子集(模板)
    for (int j = (i - 1) & i; j; j = (j - 1) & i)
        print(j);
    return 0;
}
  

相关