这个问题自然地推广到寻找所有p, q 的问题,使得2^p * 3^q 在minimum 和maximum 之间。其中min = 10^N 和max = 10^(N+1) - 1。
我会讲算法,也讲长度为2的特殊情况。
第一步是生成一个 2 的幂数组,直到您通过 max。换句话说[1, 2, 4, 8, 16, 32, 64, 128]。任何时候你看到2^p 形式的东西都可以通过数组查找来计算。
接下来我们找到min_p 和max_p,这样对于min_p <= p <= max_p,我们就有min <= 2^p <= max。我们通过从数组末尾向后搜索直到找到max_p,然后再向后搜索到min_p。在我们的例子中,min_p = 4 和 max_p = 6。
现在我们从q=0开始,如下进行。
q = 0
pow = 1
while 0 <= max_p:
for p between min_p and max_p:
add (p, q) to the answer
pow *= 3
q += 1
# We want min_p to stop at 0
while 0 < min_p and min < pow * 2^(min_p - 1):
min_p -= 1
# max_p going below 0 is how we know to stop.
while 0 <= max_p and max < pow * 2^max_p:
max_p -= 1
在我们的示例中,这将按如下方式工作:
min_p = 4, max_p = 6
q = 0
add (4, 0), (5, 0), (6, 0) to answer
q = 1
min_p = 2
max_p = 5
add (2, 1), (3, 1), (4, 1), (5, 1) to answer
q = 2
min_p = 0
max_p = 3
add (0, 2), (1, 2), (2, 2), (3, 2) to answer
q = 3
min_p = 0
max_p = 1
add (0, 3), (1, 3) to answer
q = 4
min_p = 0
max_p = 0
add (0, 4) to answer
q = 5
min_p = 0
max_p = -1
finish
我们现在的答案是:
(4, 0), (5, 0), (6, 0), (2, 1), (3, 1), (4, 1), (5, 1),
(0, 2), (1, 2), (2, 2), (3, 2), (0, 3), (1, 3), (0, 4)
也就是说:
16, 32, 64, 12, 24, 48, 96, 18, 36, 72, 27, 54, 81