多项式的加法和乘法计算

总时间限制: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;
}
原文地址:https://www.cnblogs.com/levarz/p/12781294.html