Sicily 1149 等价表达式 (SOJ 1149) 【中缀转后缀】

博客讲述了如何解决Sicily 1149问题,即判断两个含有变量a的表达式是否等价。作者提出,最长表达式为50个字符,最多可能包含a^160,因此通过161次试值可以确定表达式等价性。文章讨论了中缀转后缀的方法,并指出错误地计算10^10^10可能导致误解。作者分享了自己先求解后缀表达式再计算的思路,虽然并未显著提高效率,但使程序更清晰。同时,博客提到了符号栈和运算符优先级矩阵,并指出题目需要高精度计算,作者使用long long类型。最后,提供了试值a的范围和代码片段。
摘要由CSDN通过智能技术生成

这题乍一看觉得好蛋疼(广东话叫“DUM春”),我是要把所有的表达式都简化到最短,还是把所有表达式都展开到最长?最麻烦的就是有个变量a,好了下面是正文了。


——————————正文——————————

从这题我就学醒目了,类似近似的思想,从题干可以知道最高的次数是10···其实不是10,因为可以是这样:a^10^10^10^10.... 这样一直下去,从题干知道最长为50个字符,每个^10占3个字符,所以最多会有a^160,两条这样的曲线公共点个数的上界是160个,也就是说,对a进行161次试值,如果两个表达式相等,那么就可以认为两个表达式是等价的。

说多一句····到网上一搜可以发现,不少通过的代码使用3次试值若相等就判断表达式是相等的了,不过我个人还是觉得161次的试值是最保险的。

还有一点要注意的是,我一开始计算的是:10^10^10=10^10000000000,这样就悲剧了···哈哈。可能很多同学使用2来测试2^2^2的两种计算方法是否相等,但是这样计算出来相等是个巧合,可以直接假设要求的是a^b^c,对于两种运算顺序,取log,其中一个结果是(b^c)*log(a),另外一个是b*c*log(a),所以两种运算顺序得到的结果是不一样的。

这样就解决表达式的判断问题了。

然后就是怎么样计算表达式的值,很多的童鞋肯定看过中缀转后缀表达式,最

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值