java实现多项式的加法

Wesley13
• 阅读 665

今天学习链表的时候看到了多项式的加法,使用c语言链表编写,我现在一直在用java,采用面对对象的思想做了一下

多项式由三个部分组成:常数、系数和未知数(A、B、X等的)。多项式的加法规则是相同系数、相同未知数的常数可以进行相加,组成一个新的项,而不同系数或者不同未知数的,则不能进行相加减,应将其写到后面。我的多项式相加的想法是:先对一个用户输入的混乱的多项式根据系数来进行排序,再对排序过了两个多项式多项式相加的规则进行相加。最后输出结果。 以下是我的代码:

/**
 * 用于对多项式的每一项进行分类
 * @author steven
 *
 */
public class Point {
    private int coefficient;//系数
    private int exponent;//指数
    
    public Point(int coefficient, int exponent) {
        super();
        this.coefficient = coefficient;
        this.exponent = exponent;
    }
    public Point(){
        
    }
    /**
     * 获取系数
     * @return
     */
    public int getCoefficient() {
        return coefficient;
    }
    public void setCoefficient(int coefficient) {
        this.coefficient = coefficient;
    }
    //获取指数
    public int getExponent() {
        return exponent;
    }
    public void setExponent(int exponent) {
        this.exponent = exponent;
    }
}

上面这个类主要是为了表示系数和项数,如果,表示多项式中的一项

import java.util.ArrayList;
/**
 * 多项式
 * @author steven
 *
 */
public class Multinomial {
    private ArrayList<Point> terms=new ArrayList<Point>();

    public ArrayList<Point> getTerms() {
        return terms;
    }

    public void setTerms(ArrayList<Point> terms) {
        this.terms = terms;
    }
    /**
     * 重写toString方法主要是为了输出查看
     */
    @Override
    public String toString() {
        StringBuffer sb=new StringBuffer("");
        for (Point point : terms) {
            sb.append(point.getCoefficient()+"X"+point.getExponent()+"+");
        }
        return sb.substring(0, sb.length()-1);
    }
}

上面这个类主要是为了表示多项式,里面包含了很多的point

public class Multinomials {
    /**
     * 多项式的加法
     * @param multinomialA
     * @param multinomialB
     * @return
     */
    public static Multinomial Add(Multinomial multinomialA,Multinomial multinomialB){
        int i=0;//用于遍历multinomialA
        int j=0;//用于遍历multinomialB
        Multinomial multinomialC=new Multinomial();
        Point pointA=null;
        Point pointB=null;
        for(;i<multinomialA.getTerms().size()&&j<multinomialB.getTerms().size();){
            pointA=multinomialA.getTerms().get(i);//获取multinomialA对应位置的值
            pointB=multinomialB.getTerms().get(j);//获取multinomialB对应位置的值
            //比较指数,根据指数执行不同的命令
            if(pointA.getExponent()>pointB.getExponent()){
                multinomialC.getTerms().add(pointA);
                i++;
            }else if(pointA.getExponent()<pointB.getExponent()){
                multinomialC.getTerms().add(pointB);
                j++;
            }else{
                pointA.setCoefficient(pointA.getCoefficient()+pointB.getCoefficient());
                //pointA.setExponent(pointA.getExponent()+pointB.getExponent());
                multinomialC.getTerms().add(pointA);
                i++;
                j++;
            }
        }
        if(j!=multinomialA.getTerms().size()){//multinomialA遍历完成
            for(;j<multinomialB.getTerms().size();j++){
                pointB=multinomialB.getTerms().get(j);
                multinomialC.getTerms().add(pointB);
            }
        }
        if(i!=multinomialA.getTerms().size()){//multinomialB遍历完成
            for(;i<multinomialA.getTerms().size();i++){
                pointA=multinomialA.getTerms().get(i);
                multinomialC.getTerms().add(pointA);
            }
        }
        return multinomialC;
    }
    /**
     * 测试类
     * @param args
     */
    public static void main(String[] args) {
        Point a=new Point(5,8);
        Point b=new Point(6,7);
        Point c=new Point(-1,8);
        Point d=new Point(2,1);
        Multinomial multinomialA=new Multinomial();
        multinomialA.getTerms().add(a);
        multinomialA.getTerms().add(b);
        Multinomial multinomialB=new Multinomial();
        multinomialB.getTerms().add(c);
        multinomialB.getTerms().add(d);
        Multinomial multinomialC= Multinomials.Add(multinomialA, multinomialB);
        System.out.println(multinomialC.toString());
        
    }
}

这是仿照java的容器写的,最后的结果测试成功.源码下载地址多项式加法

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
CGAL功能大纲
算术与代数ArithmeticandAlgebra主要提供了计算几何用到的数学基础:数据类型、多项式、数据结构与算法代数基础AlgebraicFoundations这个包从概念、类和函数的角度定义了代数对CGAL的意义。数据类型NumberT
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
这可能是目前最全的!java开发手册嵩山版
在这里分享一份mybatis从入门到精通的强力教程,定能够助你一臂之力。Mybatis基本介绍1.ORM和MyBatis1.对象/关系数据库映射(ORM)1.基本映射方式1.流行的ORM框架简介目前流行的编程语言,例如Java、C等,都是面向对象的编程语言;而目前主流的数据库产品,例如Oracle、DB2等,依然是关系数据库。编程语言和底
Karen110 Karen110
3年前
人工智能数学基础-线性代数3:线性空间、线性相关及基
一、向量空间(线性空间)及基域线性空间是在考察了大量的数学对象(如几何学与物理学中的向量,代数学中的n元向量、矩阵、多项式,分析学中的函数等)的本质属性后抽象出来的数学概念。1.1、详细定义向量空间也称线性空间,设V是一个非空集合,P是一个数域。若:1.在V中定义了一种运算,称为加法,即对V中任意两个元素α与β都按某一法则对应于V内惟一确定的一个元素α
Wesley13 Wesley13
3年前
#numpy#关于数组形状
!(http://static.oschina.net/uploads/space/2016/0623/155855_t48w_987833.jpg)numpy的多维数组虽然好用,但是不熟悉的话也很难理解,今天要研究基于多项式的朴素贝叶斯,sklearn的官方示例中用了numpy,但是看不太懂numpy的那句,于是总结如下:numpy的数组相
Wesley13 Wesley13
3年前
Java8 HashMap详解
Java8HashMapJava8对HashMap进行了一些修改,最大的不同就是利用了红黑树,所以其由数组链表红黑树组成。根据Java7HashMap的介绍,我们知道,查找的时候,根据hash值我们能够快速定位到数组的具体下标,但是之后的话,需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的
Wesley13 Wesley13
3年前
MongoDB 基本使用
MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。MongoDB将数据存储为一个文档,数据结构由键值(keyvalue)对组成。MongoDB文档(
Stella981 Stella981
3年前
Sass的运算
本节我们学习Sass中的运算,一般的编程语法中都支持使用运算,Sass中同样可以做各种数学运算,包括最基本的加减乘除运算、变量运算、颜色运算、字符运算等。本节我们主要讲一下Sass中最基本的数学运算。加法运算加法运算是Sass中基本运算之一,在变量或者属性中都可以做加法运算。示例:$num
Wesley13 Wesley13
3年前
2019 OO第一单元总结(表达式求导)
一.基于度量的程序结构分析1\.第一次作业  这次作业是我上手的第一个java程序,使用了4个类来实现功能。多项式采用两个arraylist来存,系数和幂指数一一对应。1privateArrayList<BigIntegercoefs;2privateArrayList<BigIntegerdegre
Wesley13 Wesley13
3年前
OO第1~3次作业总结
作业1——多项式运算基于度量和类图分析设计先看Metrics插件做出的复杂度分析:!p1(https://oscimg.oschina.net/oscnet/123d87e58546c4287f8b76cb50279c0d8d9.jpg"metrics插件分析结果")乍一看没有红色报警,其实