我如何在多重分和除以2个不同的数字之间互换



我给出了整数 x y z> z 。在每个步骤中,我都可以乘以2或2。..或确定不可能。

例如:

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

9可以变为4 by:9/3/3x2x2x2x2/2/2 = 4如您所见,我进行了8个操作。

如何在Python中完成?

首先使用描述性变量名称,例如 start target step> step 。/p>

不,没有一种简单的方法来做到这一点,但是有直接的方式。

首先,您需要找到必要的更改。分解 start 目标分为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。那是四个步骤;您像以前一样适应所需的数字。

有您的攻击;您可以编码吗?

只是为了娱乐,这是一种蛮力的方法,它吓坏了 - 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

由于浮点不准确而将是越来越大的...

相关内容

  • 没有找到相关文章

最新更新