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<iostream>
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测试点
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椰子zii

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值