多项式乘积(Java)

来源:互联网 发布:mac用什么免费办公软件 编辑:程序博客网 时间:2024/06/17 23:18

1 多项式乘积的运算说明

做个有追求的成程序猿,哈哈。。其实是自己水平太菜啦,所以要想好好学学数据结构(网易云课堂上的数据结构课程。。。不是广告哦),就是这动手写写。
输入要求:

 * 计算两个多项式的乘法 * 输入格式: * 先输入多项式的项数,然后系数、指数成对输入 * 如:4 3 4 5 3 9 2 3 0  * 表示:3x^4 + 5x^3 + 9x^2 + 3x^0 ;

输出结果:
输出测试结果

2程序实现框架

1 表示多项式;
2 输入两个多项式;
3 两个多项式相乘;(p1多项式的每一项去乘p2的每一项,结果保存到新的多项式中,在新的多项式中注意合并同类型);
4 输出结果。

2.1 表示多项式;

首先多项式的每一项用一个类表示:

public class Node {    //系数    private int factor ;    //指数    private int index = 0 ;    //下一个节点    private Node nextNode ;    。。。。。    //构造方法和get和set方法    。。。。。}

然后用一个链表来表示一个多项式,链表类是自己实现的,可以使用Java自带的LinkList等。

public class MyLinkArray {    private Node head = null;    private Node rear = null;    /**     * 为链表添加节点     * @param node     * @return if return false, add fail ;     * else add success ;     */    public boolean add(Node node){        if(node==null){            return false ;        }        if(rear==null){            head = node ;            rear = node ;            return true;        }        rear.setNextNode(node);        rear = node ;        return true ;    }    public Node getHead() {        return head;    }    public Node getRear() {        return rear;    }    /**     * 打印链表     * @return     */    public boolean printlnLink(){        if(head!=null){            System.out.print(head.getFactor()+"x^"+head.getIndex());            Node node = head.getNextNode() ;            while(node!=null){                System.out.print(" + "+node.getFactor()+"x^"+node.getIndex());                node = node.getNextNode();            }            System.out.println();        }else{            return false ;        }        return true ;    }    /**     * 根据指数将原来的链表排序     * @return     */    public MyLinkArray sortLink(){        MyLinkArray link = new MyLinkArray() ;        Node next = head ;        while(next!=null){            Node sec = next.getNextNode();            while(sec!=null){                if(next.getIndex()<sec.getIndex()){                    int temFac = next.getFactor();                    next.setFactor(sec.getFactor());                    sec.setFactor(temFac);                    int temIndex = next.getIndex();                    next.setIndex(sec.getIndex());                    sec.setIndex(temIndex);                }                sec = sec.getNextNode();            }            link.add(next);            next = next.getNextNode();        }        return link ;    }}

2.2 输入两个多项式

主要Scanner类来实现输入:

        System.out.print("输入第一个多项式 :\n");        Scanner in=new Scanner(System.in);         int n1=in.nextInt();

完成的输入方法:

    /**     * 输入多项式     * @param p1     * @param p2     */    private static void inputFactory(MyLinkArray p1, MyLinkArray p2) {        System.out.print("输入第一个多项式 :\n");        Scanner in=new Scanner(System.in);         int n1=in.nextInt();        while(n1-->0){            int f = in.nextInt();            int index = in.nextInt();            p1.add(new Node(f,index));        }        System.out.print("输入第二个多项式 :\n");        Scanner in2=new Scanner(System.in);         int n2=in2.nextInt();        while(n2-->0){            int f = in2.nextInt();            int index = in2.nextInt();            p2.add(new Node(f,index));        }    }

2.3 乘积

废话不多说,直接上代码:

/**     * 多项式相乘     * @param p1     * @param p2     * @return     */    private static MyLinkArray multi(MyLinkArray p1, MyLinkArray p2) {        MyLinkArray p =  new MyLinkArray() ;        Node n1 = p1.getHead();        while(n1!=null){            Node n2 = p2.getHead();            while(n2!=null){                MultiNode(n1,n2,p);                n2 = n2.getNextNode();            }            n1 = n1.getNextNode();        }        return p;    }    /**     * 节点相乘 合并添加到链表中     * @param n1     * @param n2     * @param p     */    private static void MultiNode(Node n1, Node n2, MyLinkArray p) {        //相乘        int factor = 0 ;        int index = 0 ;        factor = n1.getFactor()*n2.getFactor();        index = n1.getIndex() + n2.getIndex() ;        Node result = new Node(factor,index) ;        //插入        if(p.getRear()==null){            p.add(result);        }else{            Node node = p.getHead();            boolean inserted = false ;            while(!inserted){                if(result.getIndex()==node.getIndex()){                    node.setFactor(node.getFactor()+result.getFactor());                    inserted = true ;                }else{                    if(node==p.getRear()){                        p.add(result);                        inserted = true ;                    }else{                        node = node.getNextNode();                    }                }            }        }    }

3 总结

以上实现,主要是用到了链表的实现,链表的遍历。这种方法应该可以实现大数和大数相乘。

Java源代码在这里,免费下载可以看看

0 0
原创粉丝点击