挺有难度的数学表达式问题。

xiaoqhuang 2006-10-24 03:40:33
如,有一string 型数学表达式:
1+2 和 2+1,按四则运算法则来说是一样的。

我一数组里有很多数学表达式,有些稍复杂点,如:
(3*5+3*3)
(3*3+3*5)
(5*3+3*3)
(3*3+5*3)

(5-1/10)*5
5*(5-1/10)
都是一样的

怎么把这些重复的去掉呢?

编译原理里有个逆波兰表示法,如:a+b写成ab+;(a+b)*c写成ab+c*,这个应该会有帮助。
...全文
193 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xiaoqhuang 2006-10-25
  • 打赏
  • 举报
回复
我的办法是比较+和*运算符2边的数,小的放左边
遇到
(1+2)*3

3*(1+2)
这样的,先用JS算出()内的值+0.1,再和后面数比较,小的放前面,所有上面只会是3*(1+2)

呵呵,可能还会有些重复的吧,没仔细测过。
livode 2006-10-24
  • 打赏
  • 举报
回复
刚才给的将逆波尔表示式反推得方法可以实现楼主要的,但是效率太差。
如果比较生成的树,应该会好点。
livode 2006-10-24
  • 打赏
  • 举报
回复
将表达数转换为树,排序叶节点,相同就说明原表达式一样。

转换树方法参阅任意一本编译原理书籍
========================================
不行的,只有叶结点相同,根节点不同也不行的。
逆波尔表示式就是树的后根遍历得到的结果。
xiaoqhuang 2006-10-24
  • 打赏
  • 举报
回复
将表达数转换为树,排序叶节点,相同就说明原表达式一样。

转换树方法参阅任意一本编译原理书籍
=====================================
编译原理忘得差不多了,而且还重修过。
知道编译原理也不知怎么弄到C#里面用。
xiaoqhuang 2006-10-24
  • 打赏
  • 举报
回复
并不是结果一样就要去掉的,只要把能用运算规则替换成相同的表达式去掉。
我现地先用排序,就是左边小于运算符(+、*)右边的数,去掉了一部分。(-、/运算不变)

但还有一部分去不掉。
如:
(1+2)*3

3*(1+2)
乘号2边运算的结果都是3
shrinerain 2006-10-24
  • 打赏
  • 举报
回复
将表达数转换为树,排序叶节点,相同就说明原表达式一样。

转换树方法参阅任意一本编译原理书籍
myvicy 2006-10-24
  • 打赏
  • 举报
回复
其实可以直接用js计算出这些表达式的值然后再将相同的去掉。
livode 2006-10-24
  • 打赏
  • 举报
回复
我说个思路:
将(3*5+3*3)进行逆波兰表示,即:35*33*+。然后将此逆波兰表达式反推,当遇到+,*时,生成两个表达式。如:35*33*+ ---> 35* + 33* 和 33* + 35*
| |
/ \ / \
3*5+33* 5*3+33* 3*3+35* 3*3+35*
/ \ / \ / \ / \
3*5+3*3 3*5+3*3 5*3+3*3 5*3+3*3 3*3+3*5 3*3+5*3 3*3+3*5 3*3+5*3
然后将表达式进行匹配。
bobo0124 2006-10-24
  • 打赏
  • 举报
回复
订一个规则: 远算符左面的远算数必须小于等于右面的数
myvicy 2006-10-24
  • 打赏
  • 举报
回复
把复杂的表达式帖几个出来看看。
早起晚睡 2006-10-24
  • 打赏
  • 举报
回复
编译原理里有个逆波兰表示法,如:a+b写成ab+;(a+b)*c写成ab+c*就用这个 但是我也不会
UP一下
相关推荐
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2006-10-24 03:40
社区公告

让您成为最强悍的C#开发者