【问题标题】:Optimised way to find all integers p and q such that 2^p*3^q has a given decimal length查找所有整数 p 和 q 的优化方法,使得 2^p*3^q 具有给定的十进制长度
【发布时间】:2019-12-16 17:09:23
【问题描述】:

找出ab 的所有可能组合,使得r 的十进制位数是给定的数字N

【问题讨论】:

  • 暴力破解,然后优化。可能没有简单的解决方案。
  • @duffymo 我尊重您的评论.. 但我使用 stackOverflow Platform 没有获得 BruteForce 解决方案。如果有更好的解决方案,请提出建议,或者让其他人发表他们的看法。
  • 据我所知没有。如果您发布您拥有的解决方案并要求改进,您会在这里做得更好。
  • 仍然没有你的代码。没有帮助的修改。
  • @duffymo 显而易见的解决方案是O(N^2)。有一个O(N) 算法。 (这些是操作计数,大整数操作本身可能很慢。)

标签: java algorithm math logic


【解决方案1】:

这个问题自然地推广到寻找所有p, q 的问题,使得2^p * 3^qminimummaximum 之间。其中min = 10^Nmax = 10^(N+1) - 1

我会讲算法,也讲长度为2的特殊情况。

第一步是生成一个 2 的幂数组,直到您通过 max。换句话说[1, 2, 4, 8, 16, 32, 64, 128]。任何时候你看到2^p 形式的东西都可以通过数组查找来计算。

接下来我们找到min_pmax_p,这样对于min_p <= p <= max_p,我们就有min <= 2^p <= max。我们通过从数组末尾向后搜索直到找到max_p,然后再向后搜​​索到min_p。在我们的例子中,min_p = 4max_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

【讨论】:

  • 你能告诉我最大值和最小值的值是多少吗? ?例如 2
  • 我认为 (0, 2) 不会回答。
【解决方案2】:

2^p * 3^q = 10^x 对于某些 x

10^(log10(2)*p) * 10^(log10(3)*q) = 10^x

所以

x = log10(2)*p + log10(3)*q

你知道 x 必须在 N - 1(包括)和 N(不包括)之间

所以你必须找到所有 p,q :

N - 1

然后你需要找到 p 和 q 可能的最小值和最大值,如果你分析和过滤不适当的值,你可以使用循环遍历所有 p、q 或更贪婪的解决方案来 BF

【讨论】:

    【解决方案3】:

    log(N)/log(3) 算法不够用吗?

    先求N,小数位数。

    int count_p = 0
    while (N%2 == 0) {
       count_p += 1;
       N /= 2;
    }
    
    int count_q = 0
    while (N%3 == 0) {
       count_q += 1;
       N /= 3;
    }
    

    这会给你 p 和 q。

    【讨论】:

    • 这并没有解决给定的问题。据我所知,这段代码是用来计算 2 和 3 将除以 N 的次数;这是一个非常不同的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2014-12-21
    • 2019-07-11
    相关资源
    最近更新 更多