301
社区成员
发帖
与我相关
我的任务
分享
Factor设置成接口,使Variable、Number、Expr继承该接口。Parse对字符串进行解析,得到一个Expr。Expr进行递归下降式的计算,在Term和Factor都加入compute方法,进行递归计算。toString方法得到结果。

第一次作业较为简单,在评测和互测中没有遇到Bug。
在得到存有最后结果的多项式后,调用toString将其转换为字符串。为了使字符串尽可能的短,在保证不会出现1*x或者?+0的前提下,应该尽可能的将正项放在式子的收尾,可以减少一个+。使式子变短。因此我在toString时先对多项式遍历一边,将遇到的第一个正项输出,然后再遍历一遍输出其他项,以达到目的。

Function和Index因子类,同样使它们继承Factor接口。Monomial,每个单项式的变现形式为x^n*exp(多项式)。而多项式则由一系列单项式组成。在Poly类中使用TreeMap<Monomila,BigInteger>存储单项式,其中BigINteger是每个单项式的系数。Monomial类中重写了equals和hashCode方法,以便可以在TreeMap中直接读取出可以合并的单项式。TreeMap的一个重要原因是为了使存在容器中的单项式是有序的。因为我判断两个多项式是否相同的方法是比较两个多项式toString后的字符串是否完全相同,因此要保证两个相同的多项式的容器中存储的单项式的顺序也是完全相同的。因此我加入了一个MonoComparator类,继承了Comparator<Monomial>接口并重写了compare方法,并在定义TreeMap时令this.polynomial = new TreeMap<>(new MonoComparator());这样就保证了TreeMap可以按照我制定的比较法则对容器里的内容进行排序,这样就保证了多项式的统一。


这次作业中我在强测中错了两个点。
0
(((((((((((x^8)^8)^8)^8)^8)^8)^8)^8)^8)^8)^8)^8
这个点会错是因为我将指数的类型定义位int导致无法存储过大的指数。在将其改为BigInteger后解决了问题。
2
h(x,y)=(-2*(+exp (y)-( -y*x^004++05*y*y^+002)^03*x)^+5*(-2 *exp( 013)* exp(y^ +3)- +x *(++x *-16*y^005)^+01)+exp((+007+-y^0 *004) ^+1)^5*(+ -(-y )*x--y ^03 ))
g(z ,x)= --((- 017*(+x^ +001*+007-- z*z^ +0*z)^+000*(0019*z)^00+x^+5 *z^ +0 * exp(z^+005)))^1- exp( exp (( + +-09* x+x^+3)))^002
(++(( +x*x)*( 0017)^ 00*exp(01)^ +04-h(x, x) *(-x*00*x) * (+-x) )*exp((++ x ^2--+000 ))^+002*(+ 008 )^ 00 -+x^005*-8 )
这个数据我的结果正确,但运行时间过长导致TLE。在我调试我的代码后发现我的toString方法消耗了大量的时间,因为我是用字符串比较两个exp中的多项式是否相等。因此我对这个方法进行了改进,在性能优化中写出。
这次作业我进行了两种优化。
toString方法消耗了大量的运行时间,所以我在Poly类和Monomial类中都增加了一个String属性,专门用来存对象的字符串表示,并且只在单项式或多项式的内容发生变化时才将其更新。因此在进行比较时直接使用get方法即可得到对应多项式的字符串形式,不必在每次比较时调用toString节省了大量的时间。也使我通过了强测中运行时间过长的数据点。
依次对提取后的式子进行长度比较,最后得到最短的那条。基本上可以做到强侧性能分满分(除去几个别特殊情况的提取外,也能得到99点几分)
第三次多页于第二次作业没有结构上的变化,只是增加了一个求导因子类,所以类图大体相同。
第三次作业较为简单,只要在多项式类中增加求导方法,并增加一个因子即可。


第三次作业较为简单,没有遇见Bug,并且没有hack成功。
第三次作业结果的形式与第二次作业相同,所以优化上也相同。
通过第一单元的学习,我初步体会到了面向对象程序设计的思想,体会到了迭代开发的设计思路。与我在oo先导课时将大量方法写在Main类中的设计有了很大的提升。