[英]Find value of a, b and c such that X^a * Y^b * Z^c is closest to N and a+b+c is mimimum
X
, Y
和Z
是三个正整数。 我必须找到a
, b
和c
值,使得X^a * Y^b * Z^c
最接近某个给定的数字N
而a+b+c
最小( a
, b
和c
是正整数)。
编辑 :我当前的解决方案是对从1开始的X,Y和Z进行幂次迭代。计算这些项的乘积,与先前的最佳结果进行比较,并相应地更新a,b和c的值。 下面粘贴了此方法的python代码段。 我假设X,Y和Z是大于1的整数。
def foo(X, Y, Z, N):
res = a = b = c = -1
for i in range(1, int(math.log(N)/math.log(X))):
for j in range(1, int(math.log(N)/math.log(Y))):
for k in range(1, int(math.log(N)/math.log(Z))):
product = pow(X, i) * pow(Y, j) * pow(Z, k)
if product > N:
break
if product > res:
res = product
a = i
b = j
c = k
return a, b, c
这种方法为X,Y和Z的较小值提供了正确的结果,但是我不确定它是否适用于所有值。 有什么我想念的东西或其他任何更好的方法。
您的解决方案似乎很好。 无论如何,您不会进行那么多迭代,因为幂的增长速度很快,并以对数步长达到N。
一些优化是您不必每次都计算乘积。 有一个数字并继续操纵该值。 (请参见代码)这在使用python处理大量数字时会有所帮助。
略优化的代码:
def foo2(x, y, z, N):
a = b = c = -1
i = j = k = -1
maxProd = 1
curProd = 1
for i in range(1, N):
curProd *= x
for j in range(1, N):
curProd *= y
for k in range(1, N):
curProd *= z
if curProd > N:
break
if curProd > maxProd:
maxProd = curProd
a,b,c = i,j,k
curProd //= z**k
if curProd > N:
break
curProd //= y**j
if curProd > N:
break
curProd //= x**i
return a, b, c
x = 4
y = 7
z = 3
N = 21563163762572572574634215165164617645147157
输出:
(30, 22, 14)
您的实现: 82 ms
我的实现: 14 ms
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.