特定二进制数的可能组合

时间:2015-04-18 06:57:33

标签: java c

如何使用java / c

打印特定二进制数的所有可能组合而不重复值

例如:

输入:

110011111

输出:

100111111
111110011
111001111
111111100

等。

2 个答案:

答案 0 :(得分:0)

这是我想到的第一种方式。可能是更好或更有效的方法。

  1. 构造二叉树。根节点没有值。左边是0,右边 是1(哪个是哪个并不重要)。树的深度是 位数加1(占根)。
  2. 对树进行全深度的首次遍历。计算数量 每次遍历都是1(或0)。
  3. 如果1(或0)的数字与输入匹配,那么遍历 可以添加到答案集中。

答案 1 :(得分:0)

对我来说,我会解决它(蛮力),(不是完美的解决方案):http://ideone.com/d37KDK

#include <stdio.h>

void showbits(int n)
{
    int i,k,andmask;

    for(i=31;i>=0;i--)
    {
        andmask = 1 << i;
        k = n & andmask;

        k == 0 ? printf("0") : printf("1");
    }
    printf("\n");

}

int numberOfOnes (int num) {
    int count = 0;
    unsigned int u = (unsigned int)num;
    while (u != 0) {
        if ((u&1) == 1)
            count++;
        u >>= 1;
    }
    return count;
}

int main()
{

    int n = 0b110011111;
    int n_num_of_ones = numberOfOnes(n);
    int max = 1 << 30;
    printf("max=%d\n" , max);
    int i;
    for(i = 0; i < max ; i++)
        if(numberOfOnes(i) == n_num_of_ones)
            showbits(i);
    return 0;
}