1

我一直像疯子一样在谷歌上搜索,但找不到任何足以让我开始的具体内容。请原谅我完全的菜鸟和可能恶魔般的略读能力。

基本上,我有一份包含 9 个问题的问卷,每个问题都有 2 个可能的答案。做完数学 (2^9) 后,我知道有 512 个排列。

我希望生成所有排列的列表,没有任何重复,为我提供可能的答案组合列表。

我希望我的输出看起来与此类似:

112112111

其中 1s 表示该人为某个问题选择了答案“a”,而 2s 表示该人选择了答案“b”。

任何帮助将不胜感激,谢谢。

4

3 回答 3

4

您只是在枚举 0 到 512 之间的数字,并且您希望以二进制表示形式打印字符串,其中 0 和 1 替换为 1 和 2,并适当填充,因此以下代码将起作用:

    for (int i = 0; i < 512; i++) {
        System.out.println(String.format("%9s", Integer.toBinaryString(i)).replace('1', '2').replace('0', '1').replace(' ', '1'));
    }

请参阅此相关问题以在 Java 中生成填充的二进制字符串:How to get 0-padded binary representation of an integer in java?

于 2013-03-27T12:46:23.940 回答
1

一种可能的方法是查找 111111111 和 222222222 之间仅包含 1 和 2 的所有数字。

就像是:

for (i=111111111 ; i<=222222222 ; i++)
    if (number_has_only_one_or_twos(i))
         print i
于 2013-03-27T12:42:31.693 回答
0

如果我正确阅读了您的问题,那么您只需要 0 到 511 之间数字的二进制表示(因为 511 - 0 + 1 = 512)。您需要做的就是找到该范围内每个数字的 9 位二进制表示。取 0 表示答案 B,​​取 1 表示答案 A。

您可以轻松地将二进制数转换为字符串并将 0 替换为 2 并打印出来。这就是数字二进制表示的美妙之处。这是查找给定范围内所有排列的最佳方法之一。

想象一下找到数组中所有元素的排列。将数字范围从零到数组的大小,取 1 表示您要使用该索引,取 0 表示不使用该索引。每当您遇到它时,它将大大简化该问题。

于 2013-03-27T12:52:31.000 回答