问题描述:在123456789这9个数字中间插入任意多个+和-的组合,使得表达式的值为100,输出所有符合条件的表达式。
对于该问题,前面了一个暴力测试的代码,通过itertools标准库的combinations()函数获得插入位置,然后通过itertools标准库的permutations()函数获得+和-的排列,最后构造表达式并测试其值是否为100,详见Python查找所有类似于123-45-67+89 = 100的组合
但是第一个版本的代码运行速度太慢,大概需要3.5小时。于是昨天推送了中国传媒大学胡凤国老师提出后我来实现的一个三进制算法,使用三进制加法来生成运算符的插入位置,其实也是一种暴力测试,但是由于大幅度减少了无效运算符排列,使得代码运行速度很快,瞬间就能输出结果,详见Python使用超高效算法查找所有类似123-45-67+89=100的组合
后经热心屋友@G_C提醒,第一个版本的暴力测试代码其实是可以优化提速的,于是有了今天的第三个版本的代码。
核心思路:减少不必要的计算。
参考代码与优化要点: