浙大版《数据结构(第2版)》题目集-习题3.6 一元多项式的乘法与加法运算 (20分)

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

输入格式:

输入分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

参考代码:

#include<stdio.h>
#include<stdlib.h>

typedef struct PolyNode *Polynomial;
struct PolyNode{
    int coef;
    int expon;
    Polynomial link;
};

void Attach(int c,int e,Polynomial *tail);
void printPoly(Polynomial P);
Polynomial ReadPoly();
Polynomial Mult(Polynomial P1,Polynomial P2);
Polynomial Add(Polynomial P1,Polynomial P2);

int main()
{
    Polynomial P1,P2,PP,PS;
    P1=ReadPoly();
    P2=ReadPoly();
    PP=Mult(P1,P2);
    printPoly(PP);
    PS=Add(P1,P2);
    printPoly(PS);
    return 0;
}

Polynomial ReadPoly()
{
    Polynomial p,head,tail;
    p=(Polynomial)malloc(sizeof(struct PolyNode));
    p->link=NULL;
    head=tail=p;
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        int c,e;
        scanf("%d%d",&c,&e);
        Attach(c,e,&tail);
    }
    return head;
}

void  Attach(int c,int e,Polynomial *tail)
{
    Polynomial p;
    p=(Polynomial)malloc(sizeof(struct PolyNode));
    p->link=NULL;
    p->coef=c;
    p->expon=e;
    (*tail)->link=p;
    *tail=p;
}

void printPoly(Polynomial P)
{
    Polynomial t=P;
    int flag=0;
    if(t->link==NULL)
    {
        printf("0 0\n");
        return;
    }
    while(t->link)
    {
        if(!flag)
            flag=1;
        else
            printf(" ");
        printf("%d %d",t->link->coef,t->link->expon);
        t=t->link;
    }
    printf("\n");

}

Polynomial Add(Polynomial P1,Polynomial P2)
{
    Polynomial t1,t2,p,head,tail;
    t1=P1->link;
    t2=P2->link;
    p=(Polynomial)malloc(sizeof(struct PolyNode));
    p->link=NULL;
    head=tail=p;
    while(t1&&t2)
    {
        if(t1->expon==t2->expon)
        {
            int c=t1->coef+t2->coef;
            if(c)
            {
                Attach(c,t1->expon,&tail);
            }
            t1=t1->link;
            t2=t2->link;
        }
        else if(t1->expon>t2->expon)
        {
            Attach(t1->coef,t1->expon,&tail);
            t1=t1->link;
        }
        else
        {
            Attach(t2->coef,t2->expon,&tail);
            t2=t2->link;
        }
    }
    for(;t1;t1=t1->link)
    {
        Attach(t1->coef,t1->expon,&tail);
    }
    for(;t2;t2=t2->link)
    {
        Attach(t2->coef,t2->expon,&tail);
    }
    return head;
}

Polynomial Mult(Polynomial P1,Polynomial P2)
{
    Polynomial t1,t2,p,head,tail;
    t1=P1->link;
    t2=P2->link;
    p=(Polynomial)malloc(sizeof(struct PolyNode));
    p->link=NULL;
    head=tail=p;
    if(t1==NULL||t2==NULL)
    {
        return head;
    }
    int c,e;
    while(t2)
    {
        c=t1->coef*t2->coef;
        e=t1->expon+t2->expon;
        Attach(c,e,&tail);
        t2=t2->link;
    }
    t1=t1->link;
    while(t1)
    {
        t2=P2->link;
        tail=head;
        while(t2)
        {
            c=t1->coef*t2->coef;
            e=t1->expon+t2->expon;
            while(tail->link&&tail->link->expon>e)
            {
                tail=tail->link;
            }
            if(tail->link&&tail->link->expon==e)
            {
                if(tail->link->coef+c)
                {
                    tail->link->coef+=c;
                }
                else
                {
                    p=tail->link;
                    tail->link=p->link;
                    free(p);
                }
            }
            else
            {
                p=(Polynomial)malloc(sizeof(struct PolyNode));
                p->coef=c;
                p->expon=e;
                p->link=tail->link;
                tail->link=p;
                tail=p;
            }
            t2=t2->link;
        }
        t1=t1->link;
    }
    return head;
}

思路:

这题我是用链表写的,思路是参照浙大数据结构视频所讲解的,细节方面有些不同,我所写的链表是有保留头结点的。然后我在提交的时候出现了个别测试点未通过的情况,后来有参考一位博主的测试样例成功通过4个测试点,这里给出测试样例(下图为博主博客截图)供参考:
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 一元多项式乘法运算是指将两个或多个一元多项式相乘的运算。例如,将多项式f(x)=3x^2+2x+1和g(x)=4x^3+5x^2+6x+7相乘,得到的结果为: f(x)×g(x) = (3x^2+2x+1)×(4x^3+5x^2+6x+7) = 12x^5+23x^4+32x^3+31x^2+18x+7 一元多项式加法运算是指将两个或多个一元多项式相加的运算。例如,将多项式f(x)=3x^2+2x+1和g(x)=4x^3+5x^2+6x+7相加,得到的结果为: f(x)+g(x) = (3x^2+2x+1)+(4x^3+5x^2+6x+7) = 4x^3+8x^2+8x+8 在一元多项式乘法加法运算中,需要注意多项式的次数和系数的运算。同时,还需要注意运算的顺序和规律,以避免出现错误。 ### 回答2: 一元多项式乘法运算是指将两个多项式相乘得到一个新的多项式。例如,(3x + 2)(4x + 5)可以通过配律展开得到12x^2 + 23x + 10。在进乘法运算时,我们需要将每个多项式中的每一项相乘,然后将结果相加。 与乘法不同,一元多项式加法运算比较简单,只需要将相同次数的项的系数相加即可。例如,(2x^2 + 3x + 4) + (5x^2 + 2x + 1) = 7x^2 + 5x + 5。如果两个多项式中存在相同次数的项,我们只需要将它们的系数相加,然后将结果写在相同次数的项下面。 在进一元多项式乘法加法运算时,我们需要注意多项式的次数。对于一个多项式P(x),它的次数指的是其中最高阶项的次数。例如,对于P(x) = 2x^3 + 3x^2 + 4x + 1,其次数为3,因为最高阶项是2x^3。 那么,怎样进一元多项式乘法加法运算呢?下面给出具体的计算方法: 1. 一元多项式乘法运算 对于两个多项式P(x)和Q(x),它们的乘积可以表示为: P(x)Q(x) = (a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0) × (b_mx^m + b_{m-1}x^{m-1} + ... + b_1x + b_0) 其中,a和b别表示两个多项式中各项的系数,n和m别表示它们的次数。 我们可以使用配律将每一个项相乘,然后将所有的结果相加。例如,对于P(x) = 3x^2 + 2x + 1和Q(x) = 4x + 5,它们的乘积可以表示为: P(x)Q(x) = (3x^2 + 2x + 1) × (4x + 5) = 12x^3 + 15x^2 + 8x^2 + 10x + 4x + 5 = 12x^3 + 23x^2 + 14x + 5 在进乘法运算时,我们需要按照降幂的顺序从高到低依次计算每一项。例如,在计算12x^3时,我们需要将P(x)和Q(x)中次数为3的项相乘,即3x^2 × 4x,然后将结果12x^3写在新多项式中次数为3的项下面。 2. 一元多项式加法运算 对于两个多项式P(x)和Q(x),它们的和可以表示为: P(x) + Q(x) = (a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0) + (b_mx^m + b_{m-1}x^{m-1} + ... + b_1x + b_0) 其中,a和b别表示两个多项式中各项的系数,n和m别表示它们的次数。 我们只需要将相同次数的项的系数相加即可。例如,对于P(x) = 2x^2 + 3x + 4和Q(x) = 5x^2 + 2x + 1,它们的和可以表示为: P(x) + Q(x) = (2x^2 + 3x + 4) + (5x^2 + 2x + 1) = 7x^2 + 5x + 5 在进加法运算时,我们需要将P(x)和Q(x)中相同次数的项的系数相加,然后将结果写在新多项式中相同次数的项下面。如果两个多项式中不存在相同次数的项,我们可以直接将它们写在新的多项式中。 ### 回答3: 一元多项式乘法运算指的是两个多项式相乘得到一个新的多项式一元多项式乘法运算可以通过拆展开的方式进,具体方法为将每个多项式的各项相乘,再将所有相乘得到的项进合并。例如,设有两个一元多项式f(x)和g(x) f(x) = a0 + a1x + a2x^2 + …… + anx^n g(x) = b0 + b1x + b2x^2 + …… + bmx^m 则f(x)和g(x)的乘积fg(x)为 fg(x) = (a0b0) + (a0b1 + a1b0)x + (a0b2 + a1b1 + a2b0)x^2 + …… + (anbm)x^n+m 其中,aibj表示f(x)和g(x)中第i+1项和第j+1项的系数的乘积。可以看出,fg(x)的次数为f(x)和g(x)的次数之和。 与乘法不同,一元多项式加法运算是将两个多项式相加得到一个新的多项式。具体方法为将f(x)和g(x)中同一次项的系数相加,然后将所有相加得到的项进合并。例如,设有两个一元多项式f(x)和g(x) f(x) = a0 + a1x + a2x^2 + …… + anx^n g(x) = b0 + b1x + b2x^2 + …… + bmx^m 则f(x)和g(x)的和f+g(x)为 f+g(x) = (a0+b0) + (a1+b1)x + (a2+b2)x^2 + …… + (an+bm)x^max{n,m} 其中,max{n,m}表示n和m中的最大值。可以看出,f+g(x)中的次数不超过max{n,m}。 一元多项式乘法加法运算在代数学中有广泛的应用。在多项式乘法运算中,还存在着多项式的因式解和根等问题,是数学中的重要研究领域。在实际应用中,多项式乘法和加法也常用于信号处理、计算机科学等领域。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

帅帅帅的阿豪

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

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

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

打赏作者

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

抵扣说明:

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

余额充值