PTA 7-1 一元多项式的乘法与加法运算 (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 next;
};

Polynomial ReadPoly();
Polynomial Mult(Polynomial P1,Polynomial P2);
void PrintPoly(Polynomial PP);
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;
}

//对Rear指针的处理:1.初值为NULL,根据是否为空做不同处理;2.指向一个空节点
//*pRear当前结果表达式尾项指针的指针
//函数实现在pRear后面插入节点
void Attach(int c, int e, Polynomial *pRear)  
{
    Polynomial P;
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->coef = c;
    P->expon = e;
    P->next = NULL;
    (*pRear)->next = P;
    *pRear = P;
}

Polynomial ReadPoly()
{
    Polynomial P, Rear, t;
    int c, e, N;
    scanf("%d", &N);
    P = (Polynomial)malloc(sizeof(struct PolyNode)); //链表头空节点
    P->next = NULL;
    Rear = P; 
    while (N--)
    {
        scanf("%d %d", &c, &e);
        if (c != 0)  
           Attach(c, e, &Rear); //将当前项插入多项式尾部
    }
    t = P;
    P = P->next;
    free(t); //删除临时生成的头结点
    return P;
}

Polynomial Add(Polynomial P1, Polynomial P2)
{
    Polynomial t1, t2;
    t1 = P1;
    t2 = P2;
    //生成新的头结点
    Polynomial P,t;
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    P->next = NULL;
    Polynomial Rear;
    Rear = P;
    while (t1&&t2)
    {
        if (t1->expon==t2->expon)
        {
            if (t1->coef+t2->coef)  //系数和为0时不添加到尾节点上  /*考虑周全*/
            {
                Attach(t1->coef + t2->coef, t1->expon, &Rear);
            }
            t1 = t1->next;
            t2 = t2->next;
        }
        else if (t1->expon>t2->expon)
        {
            Attach(t1->coef, t1->expon, &Rear);
            t1=t1->next;
        }else 
        {
            Attach(t2->coef, t2->expon, &Rear);
            t2 = t2->next;
        }
    }
    while (t1)
    {
        Attach(t1->coef, t1->expon, &Rear);
        t1 = t1->next;
    }
    while (t2)
    {
        Attach(t2->coef, t2->expon, &Rear);
        t2 = t2->next;
    }
    t = P;
    P = P->next;
    free(t);
    return P;
}

//多项式乘法方法:
//1. 将乘法运算转换为加法运算,让P1的每一项和P2相乘,在加到结果多项式中
//2. 逐项插入,将P1当前项乘P2当前项,在插入到结果表达式中,关键是要找到插入的位置

Polynomial Mult(Polynomial P1, Polynomial P2)
{
    Polynomial P, Rear;
    Polynomial t1, t2, t;
    if (!P1||!P2)
    {
        return NULL;
    }
    t1 = P1;
    t2 = P2;
    P = (Polynomial)malloc(sizeof(struct PolyNode));
    Rear = P;
    while (t2)
    {
        //先用P1的第一项乘以P2,得到初始结果多项式
        Attach(t1->coef*t2->coef, t1->expon + t2->expon, &Rear);
        t2 = t2->next;
    }
    t1 = t1->next;
    while (t1)
    {
        t2 = P2;
        Rear = P; //将尾节点置到头结点来
        while (t2)
        {
            int e = t1->expon + t2->expon;
            int c = t1->coef * t2->coef;   //以后的每一项相乘的结果
            while (Rear->next&&Rear->next->expon>e) //找插入位置
            {
                Rear = Rear->next;
            }
            if (Rear->next&&Rear->next->expon==e)
            {
                if (Rear->next->coef+c) //判系数是否为0
                {
                    Rear->next->coef += c;
                }
                else  //为0删除节点
                {
                    t = Rear->next;
                    Rear->next = t->next;
                    free(t);
                }
            }
            else  //插入位置
            {
                t = (Polynomial)malloc(sizeof(struct PolyNode));
                t->coef = c;
                t->expon = e;
                t->next = Rear->next;
                Rear->next = t;

                Rear = Rear->next;
            }
            t2 = t2->next;
        }
        t1 = t1->next;
    }
    t2 = P;
    P = P->next;
    free(t2);

    return P;
}

void PrintPoly(Polynomial P)
{
    int flag = 0;//辅助调整输出格式
    if (!P)
    {
        printf("0 0\n"); /*格式*/
        return;
    }
    while (P)
    {
        if (!flag) //第一次
        {
            flag = 1;
        }
        else
        {
            printf(" ");
        }
        printf("%d %d", P->coef, P->expon);
        P = P->next;
    }
    printf("\n");
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一元多项式是指只有一个未知量的多项式。它的一般形式可以表示为: a_nx^n + a_{n-1}x^{n-1} + ... + a_1x + a_0 其中,a_n, a_{n-1}, ..., a_1, a_0是多项式的系数,n是多项式的次数,x是多项式的未知量。 一元多项式乘法运算可以使用配律来实现,即将一个多项式的每一项依次乘以另一个多项式的每一项,再将得到的结果相加。例如: (2x^2 + 3x + 1) * (x^3 + 2x + 1) = 2x^5 + 7x^4 + 8x^3 + 7x^2 + 5x + 1 一元多项式加法运算则是将同次数的项相加,不同次数的项直接并列。例如: (2x^2 + 3x + 1) + (x^3 + 2x + 1) = x^3 + 2x^2 + 5x + 2 在进行多项式的加法乘法运算时,需要注意对齐同次数的项,以确保结果的正确性。 ### 回答2: 一元多项式乘法运算是指将两个或多个一元多项式相乘得到一个新的一元多项式。对于一元多项式乘法,我们需要使用配律和结合律进行运算。以两个一元多项式f(x)和g(x)相乘为例,其结果可以表示为: f(x)×g(x) = ∑i=0n ∑j=0m ai bj x(i+j) 其中,ai和bj别表示f(x)和g(x)的系数,n和m别表示f(x)和g(x)的次数。 在一元多项式加法运算中,我们将同次项的系数相加,只有一样的项才能相加。例如,对于一元多项式f(x)和g(x),他们的加法运算可以表示为: f(x) + g(x) = ∑i=0n (ai + bi)x(i) 其中,ai和bi别表示f(x)和g(x)在次数i的系数,n为f(x)和g(x)中最高次的次数。 在一元多项式加法乘法运算中,我们需要注意几点: 首先是运算顺序。在一元多项式乘法运算中,我们需要注意先进行乘法计算,再进行加法计算。在一元多项式加法运算中,我们需要先将同次项相加,然后再将不同的项按照次数从高到低排列。 其次是系数的约束。在一元多项式乘法运算中,系数的乘积需要满足乘法运算中的乘积约束。在一元多项式加法运算中,我们需要将同次项的系数相加,但是系数的大小和符号可能会影响结果的准确性。 最后,我们需要注意最高次项的系数。在一元多项式乘法加法运算中,最高次项的系数可能会决定运算结果的大小和符号。因此,在计算过程中,我们需要注意保持最高次项的系数正确。 ### 回答3: 一元多项式乘法运算是指将两个或多个一元多项式相乘的运算,而加法运算是将两个或多个一元多项式相加的运算。 对于一元多项式加法运算而言,我们只需要将相同次数的项进行相加,不同次数的项则保留原样。例如,若有两个一元多项式f(x)和g(x),其中f(x)=3x^2+2x+1,g(x)=x^2+4x+3,则它们的加法结果为f(x)+g(x)=4x^2+6x+4。 对于一元多项式乘法运算而言,我们需要将每个多项式的每一项依次相乘,并将相同次数的项相加得到一个新的多项式。例如,同样的f(x)和g(x)相乘: \begin{align} f(x) \times g(x) &= (3x^2+2x+1) \times (x^2+4x+3) \\ &= 3x^4 + 14x^3 + 17x^2 + 10x + 3 \end{align} 需要注意的是,在乘法运算中,我们可以使用配律、结合律和交换律来简化计算。例如,上述乘法运算中,我们可以别将f(x)中的每一项和g(x)中的每一项相乘,然后再相加,也可以将f(x)和g(x)展开后再相乘,最后再将同次幂的项相加。这些简化计算的方法可以根据具体情况选择使用。 同时,需要注意的是,在乘法运算中,我们要特别留意同次幂的项相加。有时候我们需要合并同次幂的项,有时候我们又需要保留它们独立。这些都需要根据具体情况进行决策。 总之,一元多项式乘法加法运算是代数学中非常基础的概念。深入理解这些概念对于我们学习更高级的代数知识和解决实际问都有很大的帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值