PTA一元多项式的乘法与加法运算

来源:互联网 发布:计算机视觉基本算法 编辑:程序博客网 时间:2024/06/17 21:57

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。

输入样例:

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

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

多项式加法:遍历比较两个多项式的每一项,哪项指数大则将其链接到结果多项式中,如果相等则相加其系数,系数和不为0则链接到结果多项式中。

多项式乘法:多项式乘法可转换为多步加法运算。即用多项式P1的第一项乘以多项式P2的每一项,得到的多项式与结果多项式P(初始值为0)相加,相加和放在P中,之后再用P1的第二项乘以P2的每一项,得到的多项式再与P相加,相加和放在P中,依此类推,直到P1为空。

#include<iostream>#include<cstdlib>#include<cstdio>using namespace std;struct PolyNode{    int coef;                //系数    int expon;               //指数     struct PolyNode *link;   //指向下一个节点的指针 };typedef  struct PolyNode *Polynomial;Polynomial P1,P2;//比较函数 int Compare(int x,int y){    if(x == y)  return 0;    else return ( (x>y) ? 1 : -1 );}//链接函数 void Attach(int c,int e,Polynomial *pRear){/*由于此函数需要改变当前表达式尾项指针的值*/ /*所以函数传递进来的是结点指针的地址*/     Polynomial P;    P = (Polynomial)malloc(sizeof(struct PolyNode));  //申请新结点    P->coef = c;         //对新结点赋值     P->expon = e;    P->link = NULL;    /*将P指向的新结点插入到当前表达式尾项的后面*/    (*pRear)->link = P;    *pRear = P;          //修改pRear值 }//加法函数 Polynomial PolyAdd(Polynomial P1,Polynomial P2){    Polynomial ha,hb,front,rear,temp;    int sum;    rear = (Polynomial)malloc(sizeof(struct PolyNode));//为方便表头插入,产生一个临时空结点作为结果多项式链表头    rear->link = NULL;     front = rear;       //由front记录结果多项式链表头结点     ha = P1->link;      //P1,P2都带头结点,因此第一个非零元素为下一个     hb = P2->link;    while(ha&&hb){  /*当两个多项式都有非0项待处理时*/        switch(Compare(ha->expon,hb->expon))        {            case 1:Attach(ha->coef,ha->expon,&rear);                   ha = ha->link;                   break;            case -1:Attach(hb->coef,hb->expon,&rear);                   hb = hb->link;                   break;            case 0:sum = (ha->coef)+(hb->coef);                   if(sum)  Attach(sum,ha->expon,&rear);                   ha = ha->link;                   hb = hb->link;                   break;         }     }    /*将未处理完的多项式的结点依次复制到结果多项式*/    for(;ha;ha = ha->link)  Attach(ha->coef,ha->expon,&rear);    for(;hb;hb = hb->link)  Attach(hb->coef,hb->expon,&rear);    rear->link = NULL;    return front; } //多项式初始化函数 Polynomial PolyCreate(int n){    Polynomial head,tmp;    head = (Polynomial)malloc(sizeof(struct PolyNode));    head->link = NULL;    Polynomial r;     r = head;                           //r始终指向终端结点,开始时指向头结点       int x,y;    while(n--){        cin>>x>>y;        Attach(x,y,&r);     }    r->link = NULL;    return head; }//乘法函数(模拟乘法——将乘法转换为加法)Polynomial PolyMulti(Polynomial P1,Polynomial P2){    Polynomial fans,ha,hb;    fans = PolyCreate(0);    ha = P1->link;      //P1,P2都带头结点,因此第一个非零元素为下一个     hb = P2->link;     if(ha == NULL || hb == NULL){        return fans;    }    while(ha){        Polynomial front,rear,temp;        rear = (Polynomial)malloc(sizeof(struct PolyNode));//为方便表头插入,产生一个临时空结点作为结果多项式链表头         rear->link = NULL;        front = rear;            //由front记录结果多项式链表头结点         temp = P2->link;         //每次都从P2的第一个结点开始         while(temp){            Attach((ha->coef)*(temp->coef),(ha->expon)+(temp->expon),&rear);            temp = temp->link;        }        rear->link = NULL;        fans = PolyAdd(fans,front);        ha = ha->link;    }    return fans;}//输出函数 void Print_Poly(Polynomial L){    Polynomial p = L->link;    int flag = 0;    if(p == NULL){        printf("0 0");    }    while(p){        if(flag)            cout<<" ";        else            flag = 1;        cout<<p->coef<<" "<<p->expon;        p = p->link;    }    cout<<endl;}int main(){    int a,b;    Polynomial p1,p2,p3,p4;    cin>>a;    p1 = PolyCreate(a);    cin>>b;    p2 = PolyCreate(b);    p4 = PolyMulti(p1,p2);    p3 = PolyAdd(p1,p2);    Print_Poly(p4);    Print_Poly(p3);    return 0; } 

乘法函数还有一种求法是逐项插入法,即先用多项式P1的一项乘以多项式P2的每一项,构成结果多项式P,之后再用P1的每一项乘以P2的每一项,每得一项就插入多项式P中。

Polynomial Multi(Polynomial P1,Polynomial P2){    Polynomial P,ha,hb;    P = PolyCreate(0);    ha = P1->link;      //P1,P2都带头结点,因此第一个非零元素为头结点下一个     hb = P2->link;     if(ha == NULL || hb == NULL){        return P;    }    int c,e;    Polynomial rear = P;    while(hb){    /*先用P1的第一项乘以P2的每一项,得到P*/         Attach((ha->coef)*(hb->coef),(ha->expon)+(hb->expon),&rear);        hb = hb->link;    }    Polynomial temp;    ha = ha->link;    while(ha){     /*逐项插入*/        rear = P;        hb = P2->link;     //每次都从第一项开始遍历        while(hb){             c = ha->coef*hb->expon;   //系数             e = ha->expon+hb->expon;  //指数             while(rear->link&&rear->link->expon > e)                 rear = rear->link;             if(rear->link&&rear->link->expon == e){                if(rear->link->coef+e)                    rear->link->coef+=e;                else{                    temp = rear->link;                    rear->link = temp->link;                    free(temp);                 }             }else{                temp = (Polynomial)malloc(sizeof(struct PolyNode));                temp->coef = c;                temp->expon = e;                temp->link = rear->link;                rear->link = temp;                rear = temp;             }             hb = hb->link;        }         ha = ha->link;    }    return P; } 
原创粉丝点击