打印包含no.s的集合子集,其中包含3的幂

时间:2015-08-11 13:13:05

标签: java

将包含3的幂的集合视为{1,3,9,27,....}。现在考虑由此集的子集组成的集合{{},{1},{3},{1,3},{9},{1,9},{3,9},{1,3,9}...}

我们应该在第n个位置获取子集并按递增顺序打印其元素,n作为输入..

例如:第4个位置(n=4)的子集是{1,3}。 n也可以是19位数字..

我很难搞清楚电源组的顺序。 apt数据类型也是java中的BigInteger吗?

一组测试用例:

n = 14 op {1,9,27}
n = 783 op {3,9,27,6561,19683}
n = 1125900981634049 op {59049, 3486784401,205891132094649, 717897987691852588770249}

2 个答案:

答案 0 :(得分:0)

答案很简单。

请注意,数字中位i的存在表示集合中的数字为3^i

因此,您遍历n的位,如果找到位设置,则将3^i添加到您的集合中。

如果从1开始,3^i的计算很容易,并且每个循环乘以3。

从这里你应该能够编写代码。

由于位操作,

n的类型应为long IMO。 3^i应被视为BigInteger,因为它可能会大到3 ^ 63。

答案 1 :(得分:0)

请注意,您的集合{{},{1},{3},{1,3},{9},{1,9},{3,9},{1,3,9}...}有一个直接映射,条目中的条目显示在列表中。来自0的编号:

0 = 0b = {}
1 = 1b = {1}
2 = 10b = {3}
3 = 11b = {1,3}
4 = 100b = {9}
5 = 101b = {1,9}
6 = 110b = {3,9}
7 = 111b = {1,3,9}
8 = 1000b = {27}
....
14 = 1110b
...
783 = 1100001111b
...
1125900981634049 = 100000000000000000001000000000100000000010000000001b

通过这种方式,只需分析序列中集合位置的位模式,就可以确定哪些项目应该出现在集合中。您需要做的就是为每个设置的位计算出3的强大功能。

使用BigInteger,因为它很简单:

List<BigInteger> powerSubSet(long which, int power) {
    // The list I will build and return.
    List<BigInteger> l = new ArrayList<>();
    // A BigInteger version of the power required.
    BigInteger p = BigInteger.valueOf(power);
    // The bit pattern I will inspect.
    BigInteger bits = BigInteger.valueOf(which);
    // Roll each power out of the bit pattern.
    for (int i = bits.bitLength(); i >= 0; i--) {
        // A set bit means yes we want this one.
        if (bits.testBit(i)) {
            l.add(p.pow(i));
        }
    }
    return l;
}

private void test(long i) {
    System.out.println("powerSubSet(" + i + ",3) = " + powerSubSet(i, 3));
}

public void test() {
    test(14);
    test(783);
    test(1125900981634049L);
}

打印

powerSubSet(14,3) = [27, 9, 3]
powerSubSet(783,3) = [19683, 6561, 27, 9, 3, 1]
powerSubSet(1125900981634049,3) = [717897987691852588770249, 205891132094649, 3486784401, 59049, 1]

请注意,{1,9,27}您有14。我得到{3,9,27},而其他人则相同。