Java 找到所有整数p和q的优化方法,使2^p*3^q具有给定的十进制长度

Java 找到所有整数p和q的优化方法,使2^p*3^q具有给定的十进制长度,java,algorithm,math,logic,Java,Algorithm,Math,Logic,查找a和b的所有可能组合,以便r的十进制位数是给定的N 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。对于某些x,p>2^p*3^q=10^x 10^(log10(2)*p)*10^(log10(3)*

查找
a
b
的所有可能组合,以便
r
的十进制位数是给定的
N

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。对于某些x,p>2^p*3^q=10^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
的问题,使得
2^p*3^q
介于
最小值和
最大值之间。其中
min=10^N
max=10^(N+1)-1

我将介绍算法,并以长度为2的特殊情况为例

第一步是生成一个2次幂的数组,直到通过
max
。换句话说,
[1,2,4,8,16,32,64,128]
。每当您看到
2^p
形式的内容时,都可以通过数组查找来计算它


接下来,我们找到
min\u p
max\u p
,以便对
min\u p执行暴力,然后进行优化。可能不容易解决。@duffymo我尊重你的意见。。但我使用了stackOverflow平台,以避免得到BruteForce解决方案。请建议是否有更好的解决方案,或者让其他人提出他们的观点。我不知道。如果你在这里发布你的解决方案并要求改进,你会做得更好。仍然没有你的代码。这不是一个有用的修改。@duffymo显而易见的解决方案是
O(N^2)
。有一个
O(N)
算法。(如果这些是运算计数,大整数运算本身可能很慢。)这并不能解决给定的问题。据我所知,这段代码是用来计算2和3除以
N
的次数的;这是一个完全不同的问题。你能告诉我最大值和最小值是多少吗?例如,我认为(0,2)不会在答案中。
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