繁体   English   中英

找到a,b和c的值,使得X ^ a * Y ^ b * Z ^ c最接近N,而a + b + c最小

[英]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

XYZ是三个正整数。 我必须找到abc值,使得X^a * Y^b * Z^c最接近某个给定的数字Na+b+c最小( abc是正整数)。

编辑 :我当前的解决方案是对从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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM