如何在多种拼接和2种不同的数字之间进行交换?

时间:2017-04-26 21:13:01

标签: python compare multiplication divide interchange

我给出了整数 X Y Z 。在每一步中,我可以乘以或除以2或3.我需要在 Y 步骤中将 X 转换为 Z 。 ..或确定它是不可能的。

例如:

X is 9,
Y is 8,
Z is 4.

9可以变为4:9/3 / 3x2x2x2x2 / 2/2 = 4 如你所见,我做了8次操作。

如何在Python中完成?

2 个答案:

答案 0 :(得分:1)

首先使用描述性变量名称,例如开始目标步骤

不,没有简单的方法可以做到这一点,但有直接的方式。

首先,您需要找到必要的更改。将开始目标分解为2,3的因子以及其他任何因素。如果这"什么"别的"没有匹配,那么你根本无法解决问题。

例如,看看你给出的问题:从9到4分解。分解每个数字:

9 = 3*3    # no 2's, no other stuff
4 = 2*2    # no 3's, no other stuff

自"其他"东西匹配(即1),你可以进行过渡。您需要删除2个因子3,并添加2个因子2.这是4个步骤。从那里,您所要做的就是添加* 3/3或* 2/2对,直到您有8个步骤。

让我们尝试将56改为126:

 56 = 2*2*2*7   # no 3's, other = 7
126 = 2*3*3*7   # other = 7

要进行转换,您需要删除两个2并添加两个3' s。那是四个步骤;你像以前一样调整到所需的数字。

你的攻击;你能编码吗?

答案 1 :(得分:0)

只是为了好玩,这是一种蛮力的方法可怕地扩展 - O(y ^ 4),

def bruteforce(x, y, z, acc="", accv=None):
    if accv == z and len(acc) == y*2:
        return acc
    if accv is None:
        accv = x
    if len(acc) == y*2:
        return
    m2 = bruteforce(x, y, z, acc+'*2', accv*2)
    m3 = bruteforce(x, y, z, acc+'*3', accv*3)
    d2 = bruteforce(x, y, z, acc+'/2', accv/2)
    d3 = bruteforce(x, y, z, acc+'/3', accv/3)
    return m2 or m3 or d2 or d3

行动中:

In [49]: exp = bruteforce(9, 8, 4)

In [50]: exp
Out[50]: '*2*2*2*2/2/2/3/3'

In [51]: eval('9'+exp)
Out[51]: 4.0

In [52]: exp = bruteforce(13, 8, 4)

In [53]: exp

In [54]: exp = bruteforce(9, 7, 2)

In [55]: exp
Out[55]: '*2*2*2/2/2/3/3'

In [56]: eval('9'+exp)
Out[56]: 2.0

由于浮点不准确而会出错......