给出整数X,Y和Z。在每个步骤中,我可以乘以或除以2或3.我需要将X变换为Z准确地说Y步骤...或确定它不可能。我怎样才能在多重分隔和2个不同的数字之间进行切换?
例如:
X is 9,
Y is 8,
Z is 4.
9可以通过成为4:9/3/3x2x2x2x2/2/2 = 4 正如你可以看到我发8个操作。
这怎么能在Python中完成?
给出整数X,Y和Z。在每个步骤中,我可以乘以或除以2或3.我需要将X变换为Z准确地说Y步骤...或确定它不可能。我怎样才能在多重分隔和2个不同的数字之间进行切换?
例如:
X is 9,
Y is 8,
Z is 4.
9可以通过成为4:9/3/3x2x2x2x2/2/2 = 4 正如你可以看到我发8个操作。
这怎么能在Python中完成?
首先使用描述性的变量名,如开始,目标,和步骤。
不,不存在容易这样做的方法,但有直接方式。
首先,您需要找到必要的更改。将开始和目标分解为因子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。这是四个步骤;你像以前一样调整到所需的数字。
有你的攻击;你可以编码吗?
但是如果我总共有9次操作,并且在达到目标时我会是一个分区还是一个multiplicacion? –
如果您的操作数量很短,您无法解决问题。 – Prune
你知道计算数字的主要因素的最有效方法吗?我尝试:for x in range(2,number)然后询问是否(数字%x == 0)保存输入if的提示数字。 –
只是为了好玩,这里是一个强力的办法可以扩展速度惊人 - Ø(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
将是越野车,因为的浮点不准确...
为了准确性,你可以使用'fractions.Fraction'。 –
@StefanPochmann是的,如果你只是传递'Fraction'对象,函数应该可以工作,但男孩会减慢速度! –
@nevabyte你如何从1做5? –
@MosesKoledoye除数不是任意的,它们可以是2或3,或者两者兼有。 –
@nevabyte嗯,是吧?但好吧,忽略1,然后用2和3做5。 –