有没有更好的方法使用数字1到10生成所有相等的算术序列?

时间:2015-03-02 07:30:07

标签: algorithm math backtracking equation-solving

问题:

  

给出了从 1 10 的数字。放等号(介于两者之间)   他们)和任何算术运算符 {+ - * /} 使得一个完美的整数   获得了相等(最终结果和部分结果必须是   整数)

示例:

  

1 * 2 * 3 * 4 * 5/6 + 7 = 8 + 9 + 10

     

1 * 2 * 3 * 4 * 5/6 + 7-8 = 9 + 10

我解决这个问题的第一个想法是使用回溯:

  1. 生成将运算符置于数字之间的所有可能性
  2. 对于这种可能性,用等号替换所有操作员,并检查我们是否有两个相同的结果
  3. 但是这个解决方案需要花费很多时间。

    所以,我的问题是:是否有更快的解决方案,可能使用运算符属性或其他一些很酷的数学技巧?

1 个答案:

答案 0 :(得分:4)

我以等号开头。选择一个可能的位置,然后在那里拆分序列。对于左侧和右侧,找到您可以获得的每个可能的结果,并将它们存储在一个字典中。然后在以后匹配它们。

找到所有226个解决方案,基于这种方法,我的Python程序不到0.15秒。所以当然没有必要进一步优化,是吗?在此过程中,我为一个方程的单个边计算了总共20683个子表达式。他们的表现相当不错:左手边有10327个表达式,右手边有10356个表达式。

如果你想变得更聪明一点,你可以尝试减少甚至尝试分裂的地方。为了在没有余数的情况下进行分裂,除数的主要因素必须包含在红利中。因此,股息必须是某种产品,而该产品必须包含您划分的数量因子。 2,3,5和7是素数,所以它们永远不会是这样的除数。 4之前永远不会有两个偶数。因此,唯一可行的方法是2*3*4*5/64*5*6*7/83*4*5*6*7*8/9。但我要说的是,在你没有任何聪明的情况下,检查某个分区是否可行会更容易。