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

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

输入格式:
输入分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

C++代码:

#include
using namespace std;
int Length_Add=0;//记录输出加法多项式的长度
int Length_Multipy=0;//记录输出乘法多项式的长度
struct LNode
{
    int index;//指数
    int coef;//系数
    LNode *next;
};
//创建链表
LNode* createList(int N)
{
    LNode *Head=new LNode;
    LNode *pHead=Head;
    int index,coef;
    while(N--)
    {
        scanf("%d%d",&coef,&index);
        LNode *node=new LNode;
        node->index=index;
        node->coef=coef;
        node->next=NULL;
        Head->next=node;
        Head=node;
    }
    return pHead;
}
//加法归并
LNode* Merge_Add(LNode *L1,LNode *L2)
{
    LNode *pL1=L1->next,*pL2=L2->next;
    LNode *temp=new LNode,*pt=temp;
    pt->coef=0;pt->index=0;
    //归并到temp上;
    while (pL1&&pL2) {
    	//指数不同,指数大的先取出
        if(pL1->index<pL2->index)
        {
            LNode *node=new LNode;
            node->index=pL2->index;
            node->coef=pL2->coef;
            node->next=NULL;
            pt->next=node;
            pt=node;
            pL2=pL2->next;
            Length_Add++;
        }
        else if(pL1->index>pL2->index)
        {
            LNode *node=new LNode;
            node->index=pL1->index;
            node->coef=pL1->coef;
            node->next=NULL;
            pt->next=node;
            pt=node;
            pL1=pL1->next;
            Length_Add++;
        }
        else//指数相同系数合并
        {
            LNode *node=new LNode;
            node->index=pL1->index;
            node->coef=(pL1->coef)+(pL2->coef);
            node->next=NULL;
            if(node->coef==0)delete node;
            else
            {
                pt->next=node;
                pt=node;
                Length_Add++;
            }
            pL1=pL1->next;
            pL2=pL2->next;
        }
    }
    while (pL1==NULL&&pL2!=NULL) {
        
        LNode *node=new LNode;
        node->index=pL2->index;
        node->coef=pL2->coef;
        node->next=NULL;
        pt->next=node;
        pt=node;
        pL2=pL2->next;
        Length_Add++;
    }
    while (pL1!=NULL&&pL2==NULL)
    {
        LNode *node=new LNode;
        node->index=pL1->index;
        node->coef=pL1->coef;
        node->next=NULL;
        pt->next=node;
        pt=node;
        pL1=pL1->next;
        Length_Add++;
    }
    return temp;
}
void printList(LNode *L1)
{
    L1=L1->next;//排除头结点
    while (L1->next!=NULL) {
        cout<<L1->coef<<" "<<L1->index<<" ";
        L1=L1->next;
    }
    //控制输出格式
    cout<<L1->coef<<" "<<L1->index;
}
void Insert_node(LNode *Result,LNode *node)
{
    LNode *p=Result,*pre=Result;
    if(p->next==NULL)
    {
        p->next=node;
        Length_Multipy++;
        return;
    }
    p=p->next;
    while (p!=NULL) {
        if(node->index>p->index)
        {
            pre->next=node;
            node->next=p;
            pre=pre->next;
            Length_Multipy++;
            break;
        }
        else if(node->index==p->index)
        {
            p->coef+=node->coef;
            if(p->coef==0){LNode *q=p;pre->next=p->next;delete q;
                Length_Multipy--;
            }
            delete node;
            break;
        }
        pre=pre->next;
        p=pre->next;
    }
    if(p==NULL)
    {
        pre->next=node;
        node->next=p;
        pre=pre->next;
        Length_Multipy++;
    }
}
//乘法归并
LNode* Merge_Multipy(LNode *L3,LNode *L4)
{
    LNode *Result=new LNode;
    Result->next=NULL;
    LNode *Result_Head=Result,*pL3=L3->next,*pL4=L4->next;
    while (pL3!=NULL) {
        while (pL4!=NULL) {
            LNode *node=new LNode;
            node->index=(pL3->index)+(pL4->index);
            node->coef=pL3->coef*pL4->coef;
            node->next=NULL;
            //插入node要按指数从大到小的顺序插入
            Insert_node(Result,node);
            pL4=pL4->next;
        }
        pL3=pL3->next;
        //pL4指针要重新指向首元结点
        pL4=L4->next;
    }
    return Result_Head;
}
int main()
{
    int N,M;
    //创建链表
    LNode *L1,*L2,*Multipy_Result,*Add_Result;
    cin>>N;
    L1=createList(N);
    cin>>M;
    L2=createList(M);
    //乘法
    Multipy_Result=Merge_Multipy(L1,L2);
    if(Length_Multipy==0)
        cout<<"0 0"<<endl;
    else{
        printList(Multipy_Result);
        cout<<endl;}
    //加法
    Add_Result=Merge_Add(L1,L2);
    if(Length_Add==0)
        cout<<"0 0"<<endl;
    else{
        printList(Add_Result);}
    return 0;
}

PTA测试点

你可能感兴趣的:(PTA)