algorithm - 找到 a、b 和 c 的值,使得 X^a * Y^b * Z^c 最接近 N 并且 a+b+c 最小

标签 algorithm

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

编辑:我目前的解决方案是迭代 X、Y 和 Z 从 1 开始的幂。计算这些项的乘积,与之前的最佳结果进行比较,并相应地更新 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 毫秒

我的实现:14 毫秒

最坏情况:

关于algorithm - 找到 a、b 和 c 的值,使得 X^a * Y^b * Z^c 最接近 N 并且 a+b+c 最小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57135434/

相关文章:

c - 红黑树中从节点A走到节点B的最快方法

algorithm - C中的抢占式任务调度

algorithm - md5 的 padding 和 sh256 一样吗?

algorithm - 检查货币转换文件是否一致

algorithm - 字阶复杂度分析

algorithm - 加权项的快速采样和更新(像红黑树这样的数据结构?)

java - 如何计算两个日期之间的总工作小时数?

ios - 如何以百分比计算角色扮演游戏等级进度

algorithm - 如何查找图是否是树及其中心

c++ - 生成不同于数组的 1000 个元素的新元素