一元稀疏多项式计算器
【问题描述】 设计一个一元稀疏多项式简单计算器。
【基本要求】一元稀疏多项式简单计算器的基本功能是:
(1) 输入并建立多项式 ;
(2) 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci 和ei,分别是第 i 项的系数和指数,序列按指数降序排列;
(3) 多项式a和b相加,建立多项式a +b;
(4) 多项式a和b相减,建立多项式a -b 。
【测试数据】
1)(2x+5×8-3.1×11) + (7-5×8+11×9)=(-3.1×11+11×9+2x+7)
2)(6x-3-x+4.4×2-1.2×9) -(-6x-3+5.4×2-x2+7.8×15)=(-7.8×15-1.2×9+12x-3-x)
3)(1 +x + x2+x3+x4+x5)+(-x3-x4)=(1+x+x2+x5)
4)(x+x3)+(-x-x3)=0
5)(x+x100)+(x100 +x200)=(x+2×100+x200)
6)(x+x2+x3)+0=x+x2+x3
7) 互换上述测试数据中的前后两个多项式
【实现提示】 用带表头结点的单链表存储多项式。
【选作内容】
1) 计算多项式在x处的值。
2) 求多项式 a 的导函数 。
3) 多项式a和b相乘,建立乘积多项式ab 。
4) 多项式的输出形式为类数学表达式。例如 ,多项式 -3×8+6&最新贺岁片#215;3-18 的输出形式为-3×8+6×3-18,x15+(-8)x7-14的输出形式为s15+(-8)x7-14。注意,数值为1的非零次项的输出形式中略去系数1,如项1×8的输出形式为x8,项 -1×3的输出形式为-x3。
**
package usps;/*吴乐 汉江师范学院 软件工程2001班数据结构期末大作业 一元稀疏多项式计算器开始 2021.12.18 22:00完成 2021.12.26 00:21优化 2021.12.26 18:00*/import java.util.scanner;public class main{ public static void main(string[] args) { scanner in=new scanner(system.in); polynomial poly = new polynomial(); int num; do {//菜单 system.out.println("\n 一元稀疏多项式计算器"); system.out.println("——————————————————————————————————————————————————————————"); system.out.println( "1.建立多项式a 2.建立多项式a+b 3.建立多项式a-b " + "\n4.建立多项式axb 5.多项式a的导函数 6.多项式在x处的值\n7.退出"); system.out.println("——————————————————————————————————————————————————————————"); system.out.print("命令: "); num=in.nextint(); switch (num)//命令 { ca 1://建立多项式 { system.out.println("请输入多项式:"); system.out.println("项的个数n <系数 指数>*n"); linklist list = poly.inpoly(); system.out.print("\n多项式: "); list.allput(); }break; ca 2://多项式 a + b { system.out.println("请输入多项式a:"); system.out.println("项的个数n <系数 指数>*n"); linklist lista = poly.inpoly(); system.out.println("请输入多项式b:"); linklist listb = poly.inpoly(); system.out.print("\n多项式 a : "); lista.allput(); system.out.print("\n多项式 b : "); listb.allput(); system.out.print("\n多项式 a+b : "); poly.addpoly(lista,listb).allput(); }break; ca 3://多项式 a - b { system.out.println("请输入多项式a:"); system.out.println("项的个数n <系数 指数>*n"); linklist lista = poly.inpoly(); system.out.println("请输入多项式b:"); linklist listb = poly.inpoly(); system.out.print("\n多项式 a : "); lista.allput(); system.out.print("\n多项式 正负两极b : "); listb.allput(); system.out.print("\n多项式 a-b : "); poly.minuspoly(lista,listb).allput(); }break; ca 4://建立多项式axb { system.out.println("请输入多项式a:"); system.out.println("项的个数n <系数 指数>*n"); linklist lista = poly.inpoly(); system.out.println("请输入多项式b:"); linklist listb = poly.inpoly(); system.out.print("\n多项式 a : "); lista.allput(); system.out.print("\n多项式 b : "); listb.allput(); system.out.print("\n多项式 axb : "); poly.mulpoly(lista,listb).allput(); }break; ca 5://多项式 a 的导函数 { system.out.println("请输入多项式a:"); system.out.println("项的个数n <系数 指数>*n"); linklist lista = poly.inpoly(); system.out.print("\n多项式 a : "); lista.allput(); system.out.print("\n多项式 a 的导函数: "); poly.derfpoly(lista).allput(); }break; ca 6://多项式在x处的值 { system.out.println("请输入多项式a:"); system.out.println("项的个数n <系数 指数>*n"); linklist lista = poly.inpoly(); system.out.println("请输入 x : "); double x = in.nextdouble(); system.out.print("\n多项式 a : "); lista.allput(); system.out.print("\nx: "+x); system.out.printf("\na(x)为(保留三位小数): %.3f",poly.getxvalue(lista,x)); }break; ca 7://退出 { system.out.println("再见"); }break; default:system.out.println("输入错误了你个蠢蛋"); } }while(num!=7); }}
package usps;public class node{ node next;//下一个结点 double coefficient;//系数 double index;//指数 public node(){ super(); } public node(node next) { this.next=next; } public node(node next,double coefficient, double index) { this.next=next; this.coefficient=coefficient;//系数 this.index=index;//指数 } public double getcoefficient() { return coefficient; } public void tcoefficient(double coefficient) { this.coefficient = coefficient; } public double getindex() { return index; } public void tind高考英语作文范文ex(double index) { this.index = index; } public node getnext() { return next; } public void tnext(node next) { this.next = next; }}
package usps;public class linklist { node head;//头结点 int length;//单链表长度 public linklist()//构造空链表 { length = 0; head = new node(null); } public void add(double s1,double s2, int pos)//在链表中加入数据 { int num=1; node p=head; node q=head.next; while(num<pos) { p=q; q=q.next; num++; } p.next=new node(q,s1,s2);//头结点不存放数据 length++; } public void allput()//链表全部输出 { if(impty()) { system.out.println("null"); } el { node p=head.next; system.out.print("("); if(p.coefficient!=0)//系数不等于0才会输出。 { if(p.coefficient!=1.0) //如果系数等于1就不用输出 { if(p.coefficient == -1 && p.index != 0) system.out.print("-"); el system.out.print(p.coefficient);//输出系数 } if(p.coefficient == 1.0 && p.index ==0) { system.out.println(1); } if(p.index != 0 && p.index != 1.0) { system.out.print("x^" + p.index); } el if(p.index == 1.0)//如果指数等于1,就不输出指数 { system.out.print("x"); } } p=p.next; while(p!=null) { if(p.coefficient!=0)//系数不等于0才会输出。 { if(p.coefficient>0) { system.out.print("+");//如果系数大于0,前面就带+号 } if(p.coefficient!=1) //如果系数等于1就不用输出 { if(p.coefficient == -1 && p.index != 0) system.out.print("-"); el system.out.print(p.coefficient);//输出系数 } if(p.coefficient == 1 && p.index == 0) { system.out.print(1); } if(p.index != 0 && p.index != 1.0) { system.out.print("x^" + p.index); } el if(p.index == 1.0)//如果指数等于1,就不输出指数 { system.out.print("x"); } } p=p.next;//继续下一个结点 } system.out.print(")"); } } public boolean impty()//判空 { return length==0; } public int getlength() //求链表长度 { return length; } public void tlength(int length)//改变链表长度 { this.length = length; }}
package usps;import java.util.scanner;public class polynomial{ public polynomial(){} public linklist inpoly()//建立一个多项式 { scanner scn=new scanner(system.in); int length;//结点个数 linklist list=new linklist(); length = scn.nextint();//输入多项式的各项参数 //排序 for(int i = 1;i <=length;i++)//将参数放进链表 { list.add(scn.nextdouble(),scn.nextdouble(),i); } return sort(nottwo(list)); } public linklist addpoly(linklist a,linklist b)//多项式相加 { linklist list = new linklist();//存储结果的链表 node a1=a.head.next;//a的头结点 node b1=b.head.next;//b的头结点 int length = 1;//结果链表的长度。 while(a1!=null && b1!=null) { if(a1.index==b1.index)//如果指数相同,则系数相加 { list.add(a1.coefficient+b1.coefficient,a1.index,length++); a1 = a1.next; b1 = b1.next;//指针后移,排除已经赋值给结果链表的结点 } el { if (a1.index > b1.index) //如果a1结点系数大于b1结点系数,就提出a1的值,因为b中都是比a1指数小的,不需要再比 { list.add(a1.coefficient, a1.index, length++); a1 = a1.next; //b1没有入链表,下一次还要比较一遍 } el//如果a1结点系数小于b1结点系数,就提出b1的值,因为a中都是比b1指数小的,不需要再比 { list.add(b1.coefficient, b1.index, length++); b1 = b1.next; //a1没有入链表,下一次还要再比一遍 } } } //将没有比完的结点都赋值给结果链表,此时另外一个链表是空的 while(a1!=null) { list.add(a1.coefficient,a1.index,length++); a1 = a1.next;//下一个结点 } while(b1!=null) { list.add(b1.coefficient,b1.index,length++); b1 = b1.next; } return sort(list); } public linklist minuspoly(linklist a,linklist b)//多项式相减 { linklist list = new linklist();//存储结果的链表 node a1 = a.head.next; node b1 = b.head.next; int length = 1; while (a1 != null && b1 != null) { if (a1.index == b1.index) { list.add(a1.coefficient - b1.coefficient,a1.index,length++); a1 = a1.next; b1 = b1.next; } el { if (a1.index > b1.index) { list.add(a1.coefficient, a1.index, length++); a1 = a1.n党性教育心得体会ext; 锰酸钾是什么颜色 //b1没有入链表,下一次还要比较一遍 } el { list.add(-b1.coefficient, b1.index, length++); b1 = b1.next; } } } while(a1!=null) { list.add(a1.coefficient,a1.index,length++); a1 = a1.next;//下一个结点 } while(b1!=null) { list.add(-b1.coefficient,b1.index,length++); b1 = b1.next; } return sort(list); } public linklist mulpoly(linklist a,linklist b)//多项式相乘 { linklist list = new linklist();//存储结果的链表 node a1=a.head.next;//a的头结点 int length = 0;//结果链表的长度。 while(a1!=null )//将a的每个项乘b的每个项 { node b1=b.head.next;//b的头结点 //每个轮回让b1回到第一个结点 while(b1!=null) { list.add(a1.coefficient*b1.coefficient, a1.index+b1.index, ++length); list.length=length; b1=b1.next; } a1 = a1.next; } return sort(nottwo(list)); } public double getxvalue(linklist a,double x)//多项式在x处的值 { double num=0; node p = a.head.next; while(p!=null) { num+=p.coefficient*(math.pow(x,p.index)); p = p.next; } return num; } public linklist derfpoly(linklist a)//求导函数 { node p = a.head.next; while(p!=null) { p.tcoefficient(p.coefficient*p.index); p.tindex(p.index-1); p = p.next; } return a; } public linklist sort(linklist list)//排序 { if(list.impty()) { system.out.println("null"); } el { node p = list.head.next; if (list.impty()) { system.out.println("null"); } el { while (p != null) { node q = p.next; node r = new node();//中转 while (q != null) { if (p.index < q.index) { r.tcoefficient(q.coefficient); r.tindex(q.index); q.tcoefficient(p.coefficient); q.tindex(p.index); p.tcoefficient(r.coefficient); p.tindex(r.index); } q = q.next; } p = p.next; } } } return list; } public linklist nottwo(linklist a)//合并同类项 { linklist list = new linklist(); node p=a.head.next; int length=0; while(p!=null)//每个轮回会将当前第一个结点与剩余结点比较,合并同类项 { node q=p.next; double coefficient=p.coefficient; while(q!=null) { if(p.index==q.index)//如果指数相等,则合并 { coefficient += q.coefficient; q.tcoefficient(0);//删除被合并的结点 q.tindex(0); } q = q.next;//比较下一个结点 } list.add(coefficient,p.index,++length);//比完一个轮回,将当前的第一个结点输入链表 p = p.next; } return list; }}
到此这篇关于java一元稀疏多项式计算器的文章就介绍到这了,更多相关java计算器内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 07:26:00,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/9789b4a01f37637bb29843854bb141d8.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Java一元稀疏多项式计算器.doc
本文 PDF 下载地址:Java一元稀疏多项式计算器.pdf
留言与评论(共有 0 条评论) |