JAVA--一元多项式相乘--带动态图

import java.util.Scanner;

/**
 * @author:Ravanla
 * @vreate:2019-10-19-17:30
 */
public class OneLetterMultiplyPolyn {
    public OneLetterMultiplyPolyn(){
        Node A = new Node();
        Node B = new Node();
        Node C = new Node();
        A = CreatePolyn();
//        A = Reverse(A);
//        Print(A);
        B = CreatePolyn();
//        Print(B);
        C = MultiplyPolybn(A, B);
        Print(C);
    }

    public static void main(String[] args) {
        OneLetterMultiplyPolyn o = new OneLetterMultiplyPolyn();
    }

在这里插入图片描述
链表插入操作的图片在
https://blog.youkuaiyun.com/weixin_43584220/article/details/102457446

    public Node MultiplyPolybn(Node A, Node B){// 两链表相乘操作
        Node pa, pb, pc, u, head;
        int k, maxExp;
        float cof;
        head = new Node();
        if (A != null && B != null) maxExp = A.exp + B.exp;
        else return head;
        pc = head;
        B = Reverse(B);
        for(k = maxExp; k >= 0; k--){
            pa = A;
            while (pa.next != null && pa.exp > k) 
            	pa = pa.next;
            pb = B;
            while (pb.next != null && pa.exp + pb.exp < k)
            	pb = pb.next;
            // 这两个找pa 和pb 位置的过程是想找到对应的 k
            //找pb 的时候只要pb.exp + pa.exp 大于等于k就行了
            
            //找到两个exp相加大于k的话后面代码会将pa 向下一个移动
            //万一移动到小于k的话后面代码还有一个机制就是将pb 向下一个移动
            //那天这两个相加等于k 就会创建新的node并计算赋值进去再插入我们的pc,pc的表头是head
            cof = (float) 0.0;
            while(pa != null && pb != null){
                if(pa.exp + pb.exp == k){
                    cof += (pa.cof * pb.cof);
                    pa = pa.next;
                    pb = pb.next;
                }else if (pa.exp + pb.exp > k) pa = pa.next;
                else pb = pb.next;
            }
            if (cof != 0.0){
                u = new Node();
                u.cof = cof;
                u.exp = k;
                Insert(pc, u);
                pc = u;
            }
        }
        B = Reverse(B);
        return head.next;
    }

创建顺序链表就不画图了吧,我有一个博客写过,可以看看
https://blog.youkuaiyun.com/weixin_43584220/article/details/102459885


     public Node CreatePolyn(){// 制作顺序链表操作
         Node head = new Node();
//         head.next = null;
//         head.exp = 0;
//         head.cof = 0;
//         head.next = null;
         Node s;
//         s.exp = 0;
//         s.cof = 0;
         Node p;
//         p.cof = 0;
//         p.exp = 0;
         Node q;
//         q.exp = 0;
//         q.cof = 0;

         Scanner sc = new Scanner(System.in);
         int exp2 = 0;
         float cof2 = 0;
         for(;;){
             s = new Node();
             p = new Node();
             q = new Node();
//             System.out.println("输入系数cof");
             cof2 = sc.nextFloat();
//             System.out.println("输入指数exf");
             exp2 = sc.nextInt();
             if(cof2 == 0 && exp2 == 0)// 浮点数直接等于0不知道可不可以,但在c是肯定不可以的(c++)
                 break;// cof 和 exp 同时为0 是退出输入
             s.exp = exp2;
             s.cof = cof2;
             q = head.next;// q 是 排头兵,拿来试探的, 不行就兆前去p
             p = head;// q 的前驱
             while(q != null && q.exp > exp2){
                 p = q;
                 q = q.next;
             }
             if(q == null || q.exp < exp2){
                 //p.next = s;
                 //s.next = q;
                 Insert(p, s);// 找到p 和 q 顺序链表里的最后一个了或则 q的指数小于exp2的了 就将装入了数据的s插入p和q之间就号了
             }else q.cof += cof2;
         }
         return head.next;
    }
    public Node Reverse(Node head){// 倒置操作
        Node q;
        Node p = null;
        Node r = new Node();
        q = head;
        while(q != null){
            r = q.next;
            q.next = p;
            p = q;
            q = r;
        }
//        head.next = p;
        head = p;
        return head;
    }

在这里插入图片描述

    void Print(Node head){// 打印操作
        Node p = head;
        if(p.next == null) return;
        while(p.next != null){
            System.out.print(p.cof + "x^" + p.exp + "+ ");
            p = p.next;
        }
        System.out.println(p.cof + "x^" + p.exp);
    }

    void Insert(Node e, Node p){// 插入操作
        p.next = e.next;
        e.next = p;
    }

}
class Node{
    int exp;// 指数
    float cof;// 系数
    Node next;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值