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

问题:

The numbers from 1 to 10 are given. Put the equal sign(somewhere between
them) and any arithmetic operator {+ – * /} so that a perfect integer
equality is obtained(both the final result and the partial results must be
integer)

例:

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

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

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

>生成在数字之间放置运算符的所有可能性
>对于这种可能性,用等号替换所有操作符,并检查我们是否有两个相同的结果

但是这个解决方案需要花费很多时间.

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

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

找到所有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.但是我会说,在你去的时候检查某个分区是否可行要容易得多,而不需要聪明.

转载注明原文:算法 – 是否有更好的方法使用数字1到10生成所有相等的算术序列? - 代码日志