expr解题报告
题目内容:
在8个8中间填写加减乘除四则运算符,是最后得到的表达式值为100。
基本思想:
由于中缀表达式需要考虑括号的问题,采用后缀表达式会更方便一些。遍历所有合法的后缀表达式,并计算表达式的值,检查是否为100。
实现方法:
使用递归函数solve()遍历所有合法的后缀表达式。
定理:一个由数字和四则运算符组成的序列为一个合法的后缀表达式的条件是:
设后缀表达式序列的长度为n,对于任意位于尾部的长度小于n的子序列,其中的数字的个数不能大于运算符的个数。
使用evaluate()函数对后缀表达式求值。
使用ep2i()函数将求值结果为100的后缀表达式转为中缀表达式。
优化策略:
Profiling表明evaluate()函数占用了高达89.8%的开销!evaluate()设计字符串的处理,而且是在一个for循环中嵌入switch语句,效率低下可以理解。目前我想不到对于evaluate有什么好的优化方法。
该程序在我的600MHzCPU上费时2.6s。
-------------------
源代码: expr.tar.bz2