首页 > 作文

Java一元稀疏多项式计算器

更新时间:2023-04-04 07:26:02 阅读: 评论:0

目录
要求:实现:main类node类linklsit类polynomial类

要求:

一元稀疏多项式计算器

【问题描述】 设计一个一元稀疏多项式简单计算器。

【基本要求】一元稀疏多项式简单计算器的基本功能是:

(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。
**

实现:

main类

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);    }}

node类

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;    }}

linklsit类

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;    }}

polynomial类

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 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图