【问题标题】:Generating binary numbers with length n with same amount of 1's and 0's生成长度为 n 且具有相同数量的 1 和 0 的二进制数
【发布时间】:2011-12-17 05:50:12
【问题描述】:

问题与标题相同。 我做了两种方法。一是直截了当。 从

生成所有位掩码

2^{n-1}

2^n

对于每个位掩码,检查是否存在相同数量的 1 和 0,如果是,则对其进行处理。 这就是问题所在,因为我必须处理这些位掩码,而不仅仅是计算它们。

我采用了第二种方法,它在 O(2^{n/2}) 时间上运行,但似乎它没有生成所有位掩码,我不知道为什么。

第二种方法是这样的: 生成从 0 到 2^{n/2} 的所有位掩码并具有有效的位掩码(称为 B)我必须执行以下操作:B#~B

其中 ~ 是负数。

例如我有 n=6,所以我将生成长度为 3 的位掩码。

例如我有 B=101,所以 ~B 将是 010 最终位掩码为 101010,正如我们所见,我们有相同数量的 1 和 0。

这种方法是好的还是我正在实施一些不好的东西?也许存在另一种有趣的方法? 谢谢

克里斯

【问题讨论】:

    标签: bitmask


    【解决方案1】:

    尝试递归方法:

    void printMasks(int n0, int n1, int mask) {
        if (!n0 && !n1) {
            cerr << mask << endl;
            return;
        }
        mask <<= 1;
        if (n0) {
            printMasks(n0-1, n1, mask);
        }
        if (n1) {
            printMasks(n0, n1-1, mask | 1);
        }
    }
    

    调用printMasks 传递所需数量的0 和1。例如,如果需要 3 个 1 和 3 个 0,可以这样调用:

    printMasks(3, 3, 0);
    

    【讨论】:

    • 嘿,谢谢你,但它的效果不太好,我的意思是......对于参数 3,3,0 它在第 35 号之前生成不好的位掩码,之后它给出了很好的数字.我已经用我的蛮力检查了它
    • @Chris 你是什么意思?它工作得很好:对于printMasks(2, 2, 0),我得到了 3、5、6、9、10 和 12 - 即 001101010110100110101100 - 2 个 1 和 2 个 0 的所有可能组合。你能举一个你得到的不好数字的例子吗? 3,3,0?
    • 对于printMasks(3,3,0),我有像25这样的数字,即11001,我们看到有2个0和3个1。和其他数字,如 21、22。但在那之后我有 35、37、38、41 等等,这些数字效果很好。如果您能帮助解决它,那就太好了:)
    • @Chris 25 是 011001,所以很好。如果您需要一个带有初始1 的数字,只需简单更改:调用printMasks(3, 2, 1)(我从n1 中减去一个,因为初始1 已经存在于mask 中)。
    • 嘿,非常感谢,它工作得很好,我想这比生成所有2^n 位掩码要快得多:) 再次感谢。
    【解决方案2】:

    给定一个二进制数,通过对足以容纳所有位的字进行恒定数量的操作(假设除以幂两次计为一次操作)。

    确定最不重要的“1”的位置(提示:如果你减少数字会发生什么)和最不重要的“0”高于它(提示:如果你将“最不重要的 1”添加到原始位置会发生什么数字?)您应该将最低有效位“0”更改为“1”,并将适当数量的最低有效位设置为“1”,并将中间位设置为“0”。

    【讨论】:

      猜你喜欢
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      相关资源
      最近更新 更多