将包含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}
答案 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}
,而其他人则相同。