zoukankan      html  css  js  c++  java
  • 多项式的加法和乘法计算

    总时间限制:1000ms 内存限制: 65536kB

    描述

    使用带头结点的单链表存储一个多项式,设计多项式加法、乘法及显示多项式的算法。

    提示:

    (1)使用带头结点单链表存储表示一个多项式,多项式结点按指数降序链接;
    结点可以如下定义:

         struct Node{
             int exp;           //指数
             int coef;          //系数
             struct Node *next;
         };
         typedef Node* Poly;
    

    (2)设计函数Poly add(const Poly & A,const Poly & B)完成两个多项式的加法运算;

    (3)设计函数Poly mul(const Poly & A,const Poly & B)完成两个多项式的乘法运算;

    (4)设计函数void printPolynomial(const Poly &)显示输出一个多项式。

    (5)要求在main函数中进行测试。

    (6)多项式3x5-7x+6用一个整数序列表示为:3 5 -7 1 6 0 0 0,多项式项的指数<=100。< span="">

    输入

    两行,每行表示一个多项式,按多项式的指数降序输入,一个多项式的输入用0 0表示结束

    输出

    两行

    第一行为多项式的加

    第二行为多项的乘
    输出形式形如3x^5-7x+6

    样例输入

    3 5 -7 1 6 0 0 0
    -4 5 2 2 7 1 2 0 0 0

    样例输出

    -x^5+2x^2+8

    -12x^10+6x^7+49x^6-18x^5-14x^3-37x^2+28x+12


    ac代码

    /*
    @File     :   poly_calculation.cpp
    @Time     :   2020/03/19 15:56:01
    @Contact  :   levarz@163.com 
    @Desc     :   多项式的加法和乘法计算
    */
    #include <iostream>
    #include <stdlib.h>
    
    using namespace std;
    //多项式结构体
    typedef struct Node
    {
        int exp;              //指数
        int coef;             //系数
        struct Node *next;
    }*Poly;
    /**
     * @brief 初始化一个结点
     * 
     * @param node 需要初始化的结点指针
     */
    void initNode(Node *&node);
    /**
     * @brief 单项式加多项式,看做一个结点插入链表
     * 
     * @param node 单项式指针
     * @param poly 多项式指针
     */
    void insert(Node *node,const Poly &poly);
    /**
     * @brief 复制一个多项式链表
     * 
     * @param A 多项式A
     * @return Poly 复制结果
     */
    Poly copy(const Poly A);
    /**
     * @brief 初始化一个多项式链表,输入系数,指数,以空格隔开,0 0 代表输入结束
     * 
     * @param head 多项式头指针
     */
    void initPolynomial(Poly &head);
    /**
     * @brief 计算多项式A加B
     * 
     * @param A 多项式A
     * @param B 多项式B
     * @return Poly 计算结果
     */
    Poly add(const Poly A, const Poly B);
    /**
     * @brief 计算多项式A乘B
     * 
     * @param A 多项式A
     * @param B 多项式B
     * @return Poly 计算结果
     */
    Poly mul(const Poly A, const Poly B);
    /**
     * @brief 计算单项式A乘多项式B,用作多项式乘法基础
     * 
     * @param A 单项式A
     * @param B 多项式B
     * @return Poly 计算结果
     */
    Poly mul_base(const Poly A, const Poly B);
    /**
     * @brief 打印多项式
     * 
     * @param A 多项式A
     */
    void printPolynomial(const Poly &A);
    
    int main(int argc, char const *argv[])
    {
        Poly A, B;
        initPolynomial(A);
        initPolynomial(B);
        printPolynomial(add(A,B));
        printPolynomial(mul(A,B));
        system("pause");
        return 0;
    }
    void initNode(Node *&node)
    {
        node = (Node*)malloc(sizeof(Node));
        node ->next = NULL;
    }
    void initPolynomial(Poly &head)
    {
        Poly node,head_;
        initNode(head);
        head_ = head;
        while (1) {
           initNode(node);
           cin >>node->coef >>node->exp;
           if (node->coef==0&&node->exp==0) return;
            head_->next = node;
            head_ = node;
        } 
    }
    void printPolynomial(const Poly &A)
    {
        int f =1;
        for (Poly poly = A->next; poly; poly = poly->next, f++) {
            if (poly->coef>0) {                                     //正数显示规则
                if (f==1) {                                         //多项式首部不显"+"
                    if(poly->coef!=1) cout <<poly->coef;            //系数不为1时头部显示                                   
                }else{
                    if(poly->coef!=1||(poly->coef==1&&poly->exp==0)) cout <<"+" <<poly->coef;
                }
            } else {
                if (poly->coef!=-1||(poly->coef==-1&&poly->exp==0)) cout <<poly->coef;
                else cout <<"-";
            }
            if (poly->exp!=0) {
                if (poly->exp!=1) cout <<"x^" <<poly->exp;
                else cout <<"x";
            }
        }
        cout <<endl;
    }
    Poly add(const Poly A, const Poly B)
    {
        Poly result = copy(A);
        for (Poly b=copy(B)->next;b;b=b->next) {
            insert(b,result);
        }  
        return result;
    }
    void insert(Poly node, const Poly &poly)
    {
        Poly n, p;
        for (p = poly;p->next;p=p->next) {
            if (p->next->exp==node->exp) {
                p->next->coef+=node->coef;
                if (p->next->coef==0) p->next = p->next->next;
                return;  
            } 
            if ((p->next->exp)<(node->exp)) {
                initNode(n);
                n->coef = node->coef;
                n->exp = node->exp;
                n->next = p->next;
                p->next = n;
                return;
            } 
        }
        initNode(n);
        n->coef = node->coef;
        n->exp = node->exp;
        n->next = p->next;
        p->next = n;
        return;
    }
    Poly copy(const Poly A)
    {
        Poly copy_A, node, head;
        initNode(copy_A);
        head = copy_A;
        for (Poly p = A->next;p;p=p->next) {
            initNode(node);
            node->coef = p->coef;
            node->exp = p->exp;
            head->next = node;
            head = node;
        }
        return copy_A;
    }
    Poly mul_base(const Poly A, const Poly B)
    {
        Poly result = copy(B);
        for (Poly b =result ->next;b; b = b->next) {
            b->coef*=A->next->coef;
            b->exp+=A->next->exp;
        }
       return result; 
    }
    Poly mul(const Poly A, const Poly B)
    {
        Poly tem;
        initNode(tem);
        for (Poly a = A;a->next;a=a->next) {
            tem=add(mul_base(a,B),tem);
        }
        return tem;
    }
    
  • 相关阅读:
    Linux停SVN提交时强制写日志
    svn文件提交时强制写注释
    ssh 登录出现的几种错误以及解决办法
    Linux内存调试工具初探-MEMWATCH
    段错误调试神器
    Linux环境下段错误的产生原因及调试方法小结
    pthread_create()之前的属性设置
    Linux netstat命令详解
    Linux route命令详解和使用示例(查看和操作IP路由表)
    tomcat最大线程数的设置
  • 原文地址:https://www.cnblogs.com/levarz/p/12781294.html
Copyright © 2011-2022 走看看