问题:
给出了从 1 到 10 的数字。放等号(介于两者之间) 他们)和任何算术运算符 {+ - * /} 使得一个完美的整数 获得了相等(最终结果和部分结果必须是 整数)
示例:
1 * 2 * 3 * 4 * 5/6 + 7 = 8 + 9 + 10
1 * 2 * 3 * 4 * 5/6 + 7-8 = 9 + 10
我解决这个问题的第一个想法是使用回溯:
但是这个解决方案需要花费很多时间。
所以,我的问题是:是否有更快的解决方案,可能使用运算符属性或其他一些很酷的数学技巧?
答案 0 :(得分:4)
我以等号开头。选择一个可能的位置,然后在那里拆分序列。对于左侧和右侧,找到您可以获得的每个可能的结果,并将它们存储在一个字典中。然后在以后匹配它们。
找到所有226个解决方案,基于这种方法,我的Python程序不到0.15秒。所以当然没有必要进一步优化,是吗?在此过程中,我为一个方程的单个边计算了总共20683个子表达式。他们的表现相当不错:左手边有10327个表达式,右手边有10356个表达式。
如果你想变得更聪明一点,你可以尝试减少甚至尝试分裂的地方。为了在没有余数的情况下进行分裂,除数的主要因素必须包含在红利中。因此,股息必须是某种产品,而该产品必须包含您划分的数量因子。 2,3,5和7是素数,所以它们永远不会是这样的除数。 4之前永远不会有两个偶数。因此,唯一可行的方法是2*3*4*5/6
,4*5*6*7/8
和3*4*5*6*7*8/9
。但我要说的是,在你没有任何聪明的情况下,检查某个分区是否可行会更容易。