- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
等价表达式
NOIP2005-4解题报告:等价表达式(equal.pas/c/cpp)
【问题描述】
明明进了中学之后,学到了代数表达式。有一天,他碰到一个很麻烦的选择题。这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的要求是判断选项中哪些代数表达式是和题干中的表达式等价的。
这个题目手算很麻烦,因为明明对计算机编程很感兴趣,所以他想是不是可以用计算机来解决这个问题。假设你是明明,能完成这个任务吗?
这个选择题中的每个表达式都满足下面的性质:
1. 表达式只可能包含一个变量‘a’。
2. 表达式中出现的数都是正整数,而且都小于10000。
3. 表达式中可以包括四种运算‘+’(加),‘-’(减),‘*’(乘),‘^’(乘幂),以及小括号‘(’,‘)’。小括号的优先级最高,其次是‘^’,然后是‘*’,最后是‘+’和‘-’。‘+’和‘-’的优先级是相同的。相同优先级的运算从左到右进行。(注意:运算符‘+’,‘-’,‘*’,‘^’以及小括号‘(’,‘)’都是英文字符)
4. 幂指数只可能是1到10之间的正整数(包括1和10)。
5. 表达式内部,头部或者尾部都可能有一些多余的空格。
下面是一些合理的表达式的例子:
((a^1) ^ 2)^3,a*a+a-a,((a+a)),9999+(a-a)*a,1 + (a -1)^3,1^10^9……
【输入文件】
输入文件equal.in的第一行给出的是题干中的表达式。第二行是一个整数n(2 = n = 26),表示选项的个数。后面n行,每行包括一个选项中的表达式。这n个选项的标号分别是A,B,C,D……
输入中的表达式的长度都不超过50个字符,而且保证选项中总有表达式和题干中的表达式是等价的。
【输出文件】
输出文件equal.out包括一行,这一行包括一系列选项的标号,表示哪些选项是和题干中的表达式等价的。选项的标号按照字母顺序排列,而且之间没有空格。
【样例输入】
( a + 1) ^2
3
(a-1)^2+4*a
a + 1+ a
a^2 + 2 * a * 1 + 1^2 + 10 -10 +a -a
【样例输出】
AC
【数据规模】
对于30%的数据,表达式中只可能出现两种运算符‘+’和‘-’;
对于其它的数据,四种运算符‘+’,‘-’,‘*’,‘^’在表达式中都可能出现。
对于全部的数据,表达式中都可能出现小括号‘(’和‘)’。
【分析】这道题,如果真的老老实实的幻想去把多项式展开并且一项一项比较系数的话,怕是竞赛的3个小时根本不够。所以,这里采用了代入法,说白了,就是给a赋几个值,看看结果相不相等。为了保险,我用了个数,-7,0,19,38。全部测试数据通过。(如果带入4个特殊值,不相等的式子还能恰好相等的话,我就可以去买彩票了)。
接下来时算法。计算中缀表达式((a+1)^2-2*3^4)是十分困难的,所以,将它转化成易于计算机计算的后缀表达式(a.1.+2.^2.3.4.^*-),就可以十分轻松的,利用栈来计算。
中缀转后缀的过程(Procedure Find)是我自己写的,比有些辅导书上的代码好(代码短 易理解 计算快 内存占用少),那些辅导书的代码,用的是递推,内存占用比较大,计算也稍微慢一些。
计算后缀表达式的代码(Procedure Calc)是Copy的,代码清晰明了,那本书真的不错。
最后要说的是数据规模。题目虽然说表达式中出现的整数不会超过1W,但是带入计算就不行了,规模比较大。特别是最后一组测试数据,算式没有进行到一半,就已经是10位数了,全算下来,将近20位!(这个算式一上来就是(1000+24)^3,我同学说,哎,这个数1G(大小,而非占用磁盘空间),我一想,可不是嘛,1024^3=1024^2K=1024M=1G)所以,要用int64这个整型变量(注意:这个整型数据类型,只可以用在FPC,ANSI Pascal/Borland Pascal/Turbo Pascal都不行),这个类型一个数64Bits(64Bits=8Bytes),范围 -(2^63)-1到+(2^63)-1.(警告:不要用int64进行读入操作)
本程序是我辛辛苦苦编制调试出来的,只有计算后缀表达式部分(Procedure Calc)是Copy的。希望对各位编程爱好者有所帮助。水平有限,希望与大家交流从而进步。
【外一篇】其实也就是用Pascal编程很麻烦,这个问题如果不是竞赛的话,完全可以用一个超级简便的方法解决——Casio ClassPad计算器。简单到只用expand命令就能解决它![Casio ClassPad计算器expand(展开多项式)命令示例截图 ]阅读 本人在空间对她的介绍 : 超强学生用计算器——Cas
文档评论(0)