首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么用程序证明这两个公式等价

2012-03-20 
如何用程序证明这两个公式等价?1.inta1,b2,cca+b2.intx1,y2,zzx+y问题.ca+b和zx+y的语义是一

如何用程序证明这两个公式等价?
1.
    int   a=1,b=2,c;
    c=a+b;

2.
    int   x=1,y=2,z;
    z=x+y;

问题.c=a+b和z=x+y的语义是一样的,如何用程序证明这两个公式等价?   一个简单的笨方法是把两个公式都标准化,例如:把变量名都统一,则1和2的程序都变为如下:
    1.int   v0=1,v1=2,v3;
        v3=v0+v1;
    2.int   v0=1,v1=2,v3;
        v3=v0+v1;
这样一来就可以用程序比较了?
              但问题又出现了,如果把2的公式修该一下,变为v3=v1+v0,就不好比较了,各位朋友,有什么好的方法解决这类问题?谢谢.




[解决办法]
编译后,反编译,察看汇编代码是否一样。。。
[解决办法]
如果你写过计算器的程序,就会知道怎么把一个式子分解成操作数与操作码,然后操作数进入操作数的堆栈,操作码进入操作码的堆栈,最后按照优先级进行消解,如果最如果两个栈都为空,那么这两个等式相等.
这里不用很麻烦,只用分解成操作数与操作码,然后各自入栈,弹出对应栈顶,比较一下,操作数与操作码的顺序相同,则等式相等.
[解决办法]
如果你写过计算器的程序,就会知道怎么把一个式子分解成操作数与操作码,然后操作数进入操作数的堆栈,操作码进入操作码的堆栈,最后按照优先级进行消解,如果最如果两个栈都为空,那么这两个等式相等.
这里不用很麻烦,只用分解成操作数与操作码,然后各自入栈,弹出对应栈顶,比较一下,操作数与操作码的顺序相同,则等式相等.
==============
支持 ...
[解决办法]
应该是用2叉树后序遍历来实现表达式分析。
然后根据运算符的交换/翻转规律对2叉树进行变换,来判断相等。
[解决办法]
不知道你是否涉及复杂的公式

比如

(a + b) * (a + b)



a*a + 2*a*b + b*b

等价
[解决办法]
程序必须知道加法乘法是可以交换的,减法和除法不能交换才行。
[解决办法]
供参考:
int a=1,b=2,c=3,d=1,e=2,f=3;
a=a+b*c+d-e*f;

int x=1,y=2,z=3,u=1,v=2,w=3;
x=u+x-v*w+z*y;

首先,将“+”,“—”分开,减号在前,加号在后:
-e*f+a+b*c+d
-v*w+u+x+z*y

然后,在各自区域内分别比较,以“+”为例:
将含有“*”和“/”的表达式放在前:
b*c+a+d
z*y+u+x
将所有的表达式进行排序(表达式以“+”分开):
1.总体上表达式按照符号从多到少排序;
2.在表达式内部,“*”排在前,“/”排在后;
3.所有“*”两侧的数按大小排序,“/”两侧的不变;
4.如果符号个数相同,“*”和“/”也分别相同,则顺次比较操作数决定大小;
5.“+”的部分按照数的大小排序;
6.将所有表达式按照1-5的规定排列好。
结果如下:
b*c+a+d
y*z+u+x
顺次比较上下两式,可得结果。(本人未考虑括号)

热点排行