2.2 多项式乘法与加法运算(线性结构,C)

article/2025/8/15 9:18:11

多项式乘法与加法运算

      • 设计函数分别求两个一元多项式的乘积与和
        • 题意理解
        • 题意理解
      • 求解思路
        • 多项式表示
          • 两种表示方式
          • 在事先已经知道具体多少项的时候,本题较好的实现方法:==动态数组==
          • 链表表示多项式的方法
        • 程序框架
        • 如何读入多项式
          • 读入多项式的完整程序
        • 加法实现
        • 乘法实现
          • 把P1的第一项乘以P2的每一项
          • 把当前两项乘积的结构如何插进去
        • 多项式输出
      • 多项式乘法与加法运算实现源码
      • 运行

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

原题直达:02-线性结构2 一元多项式的乘法与加法运算

请添加图片描述
设计函数分别求两个一元多项式的乘积与和。

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

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

输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1

题意理解

  • 第一列的4和3分别代表两个多项式的项数,第一个总共四项,第二个总共三项
  • 第一行代表第一个多项式的项数,总共有四项,把这四项的系数指数按顺序列出来,比如3 4就是3x的4次方 ,-5 2就是-5x的平方
输出样例:
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

题意理解

  • 第一行输出为乘积结果,按系数,指数这样的顺序输出
  • 第二行输出为两个多项式相加的结果

由题意已知两个多项式
(1)3x4-5x2+6x-2
(2)5x20-7x4+3x

  • 指数相同的项,系数相加减,同类项合并

  • (a+b)(c+d)=ac+ad+bc+bd,两项相乘,系数相乘,指数相加,依次相乘得出结果后,合并同类项

求解思路

多项式表示

线性序列,仅表示非零项的指数,系数,一对一对的表现出来

两种表示方式
  • 数组:需要事先确定数组的大小
  • 链表:动态性比较强,编的程序比较复杂,涉及到指针,调试困难
在事先已经知道具体多少项的时候,本题较好的实现方法:动态数组
  • 如,已知有四项,就通过空间申请malloc,申请四个结构的这样的一个数组,然后把四个信息放到结构数组里面去
链表表示多项式的方法

在这里插入图片描述

程序框架

在这里插入图片描述

如何读入多项式

+ 第一个整数代表有多少项,接下来是一对一对的系数指数这些项

  • 第一个整数代表有多少项,接下来是一对一对的系数指数这些项
  • 先读入N,接下来做四轮的循环,每轮循环读入一对数(系数、指数),分别放到c和e里边去,读进来之后,构造一个结点,把这个结点插到多项式里面去,读的过程是从指数递降的顺序来进行读的,所以读入一个新结点的时候,应该插在前面一个结点的后面,最后形成P1所指向的链表
    在这里插入图片描述
    读入是从左到右读入的,先读的是指数高的这一项,插到链表里面去,接下来再读对数,再插进去,再构造一个新结点,再查到前面去,因为是指数递降的顺序,所以在链表里也是指数递降的,应该插到原来结果的后面,所以需要一个指针Rear,指向当前结果多项式的最后一项,是新结点能插到后面,通过函数Attach完成
    在这里插入图片描述
    插入新结点之后,Rear值也要更改,指向最新结点上面去,所以传进Rear的参数必须是指针,保证能被改变
    在这里插入图片描述
  • 为NULL时,说明是刚开始的第一个结点,需要申请这个结点,然后把Rear指向这个结点
  • 不为NULL时,直接把新结点插到Rear的后面
    在这里插入图片描述
  • 一开始指向一个空结点,让Rear指向这个空结点,以后所有新插入结点全插入到Rear后面,在Attach函数中就不需要判别Rear是不是空了。
  • 利用临时申请一个空结点的方法,使得程序的处理起来一致性比较强,代码简单。最后注意把空结点删掉。

在这里插入图片描述

这里传进来的是Polynomial这个类型的指针,Polynomial本身也是指针,所以pRear是指针的指针,C语言是函数常数值传递
在这里插入图片描述

  • 再把P赋值给(*pRear)->link这个指针就指过去了
    在这里插入图片描述
    再把P赋值给*pRear
    在这里插入图片描述
读入多项式的完整程序

在这里插入图片描述

加法实现

在这里插入图片描述

  1. t1和t2都不为空的时候,
  • 比较当前t1,t2所指向的指数是否相等,相等的话,系数就相加,等于0就不管了,不等于就把新的系数指数加到Rear后面。
  • 如果t1,t2所指向的指数不相等,就把大的拷贝到Rear后面
  1. 如果有一个为空,就把剩下来的接到Rear后面,用两个while循环分别处理t1不空的情况和t2不空的情况,最后返回

乘法实现

在这里插入图片描述

逐项插入代码如下
在这里插入图片描述
还存在3个问题

  • 怎么构造初始的多项式,就是把P1的第一项乘以P2的每一项
  • 把当前两项乘积的结构如何插进去
  • 结果怎么处理
把P1的第一项乘以P2的每一项

在这里插入图片描述

把当前两项乘积的结构如何插进去

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 结果怎么处理
    在这里插入图片描述

多项式输出

  • 基本框架
    在这里插入图片描述
  • 详细函数
    在这里插入图片描述

多项式乘法与加法运算实现源码

#include <stdio.h>
#include <stdlib.h>typedef int ElementType;  /* ElementType类型根据实际情况而定,这里假设为int */typedef struct PolyNode *Polynomial;
struct PolyNode {     /* 队列中的结点结构 */ ElementType coef;  //系数ElementType expon;  //指数Polynomial link;  //指向下一个结点的指针
};int Compare(int a,int b) {if (a > b) return(1);if (a < b)return(-1);else return(0);
}/*将传入值加到Rear指向的结点后面(最后一位)*/
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;(*pRear)->link = P;/*把新申请的结点P插到rear的后面*/*pRear = P;  /*修改pRear值*/
}/*读入多项式*/
Polynomial ReadPoly() {Polynomial P, Rear, t;int c, e, N;//printf("请输入第一位数N(共几项),后面为项目的系数指数,空格隔开\n");scanf("%d",&N);P = (Polynomial)malloc(sizeof(struct PolyNode));/*链表头空结点*/P->link = NULL;Rear = P;while (N--){scanf("%d %d",&c,&e);Attach(c,e,&Rear);     /*将当前项插入多项式尾部*/}t = P; P = P->link; free(t); /*删除临时生成的头结点*/return P;
}/*两个多项式相加*/
Polynomial PolyAdd(Polynomial P1, Polynomial P2) {Polynomial front, rear, temp; /*两个指针front和rear分别指向结果多项式的头和尾*/int sum;rear = (Polynomial)malloc(sizeof(struct PolyNode));/*申请一个空间,front和rear都指向它*/front = rear;  /*由front记录结果多项式链表头结点*/while(P1&&P2)  /*当两个多项式都有非零项待处理时*/switch (Compare(P1->expon, P2->expon)) {case 1:   /*P1->expon>P2->expon*/Attach(P1->coef, P1->expon, &rear);   /*将P1的当前项存入结果多项式,*/P1 = P1->link;  /*并使P1指向下一项*/break;case -1:  /*P1->expon<P2->expon*/Attach(P2->coef, P2->expon, &rear); /*将P2的当前项存入结果多项式,*/P2 = P2->link; /*并使P2指向下一项*/break;case 0: /*P1->expon==P2->expon*/sum = P1->coef + P2->coef; /*系数相加,*/if (sum) Attach(sum,P1->expon,&rear); /*若结果不为0,则作为结果多项式对应项的系数。*/P1 = P1->link;P2 = P2->link;  /*同时,P1和P2都分别指向下一项*/break;}/*循环结束退出的时候,就是P1或P2里面有一个为空了*//*将未处理完的另一个多项式的所有结点依次复制到结果多项式中去*/for (; P1; P1 = P1->link) Attach(P1->coef,P1->expon,&rear);for (; P2; P2 = P2->link) Attach(P2->coef, P2->expon, &rear);rear->link = NULL; /*rear指向结果多项式的最后一项,加完之后,最后一项没了,把link设为NULL*/temp = front;front = front->link; /*令front指向结果多项式第一个非零项*/free(temp);  /*释放临时空表头结点*/return front;
}/*两个多项式相乘*/
Polynomial Mult(Polynomial P1, Polynomial P2) {Polynomial P, Rear, t1, t2, t;int c, e;if (!P1||!P2) return NULL;t1 = P1; t2 = P2;P= (Polynomial)malloc(sizeof(struct PolyNode));P->link = NULL;Rear = P;while (t2) {/*先用P1的第一项乘以P2,得到P*/Attach(t1->coef*t2->coef,t1->expon+t2->expon,&Rear);t2 = t2->link;}t1 = t1->link;while (t1) {t2 = P2; Rear = P;while (t2) {e = t1->expon + t2->expon;c = t1->coef*t2->coef;while (Rear->link&&Rear->link->expon > e)/*Rear指向下一结点的指数是不是比准备插入的要大,*/Rear = Rear->link; /*如果大,Rear就不断往后挪*/if (Rear->link&&Rear->link->expon == e) {/*如果系数相等,就不插入,合并,*/if (Rear->link->coef + c)Rear->link->coef += c;else {t = Rear->link;Rear->link = t->link;free(t);}}else {/*如果不相等,比它小就插入进去*/t= (Polynomial)malloc(sizeof(struct PolyNode));t->coef = c; t->expon = e;t->link = Rear->link;Rear->link = t; Rear = Rear->link;}t2 = t2->link;}t1 = t1->link;}t2 = P; P = P->link; free(t2); /*将P指向结果多项式第一个非零项*/return P;
}void PrintPoly(Polynomial P) {/*输出多项式*/int flag = 0;  /*辅助调整输出格式用*/if (!P) { printf("0 0\n"); return; }while (P) {if (!flag)flag = 1;elseprintf(" ");printf("%d %d",P->coef,P->expon);P = P->link;}printf("\n");
}int main() {Polynomial P1, P2,PP,PS;P1 = ReadPoly();P2 = ReadPoly();PP = Mult(P1,P2); //乘PrintPoly(PP);PS=PolyAdd(P1, P2);//加PrintPoly(PS);return 0;
}

运行

//请输入第一位数N(共几项),后面为项目的系数指数,空格隔开
4 3 4 -5 2 6 1 -2 0
//请输入第一位数N(共几项),后面为项目的系数指数,空格隔开
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
  • 程序运行测试
    在这里插入图片描述

http://chatgpt.dhexx.cn/article/PycFD8B1.shtml

相关文章

多项式乘法问题

多项式乘法问题 实验目的&#xff1a;设计一个一元稀疏多项式简单计算器。 实验内容与要求&#xff1a; 一元稀疏多项式简单计算器的基本功能是&#xff1a; &#xff08;1&#xff09;输入并建立多项式&#xff1b; &#xff08;2&#xff09;输出多项式&#xff0c;序列…

网络协议之视频直播核心技术讲解

网络视频直播存在已有很长一段时间&#xff0c;随着移动上下行带宽提升及资费的下调&#xff0c;视频直播被赋予了更多娱乐和社交的属性&#xff0c;人们享受随时随地进行直播和观看&#xff0c;直播的打开时间和延迟变成了影响产品功能发展重要指标。 那么&#xff0c;问题来了…

直播软件搭建技术原理:CDN 与直播

直播软件搭建技术原理&#xff1a;CDN 与直播 很多直播都是基于 CDN 来实现的。而通过声网的服务&#xff0c;或基于声网SDK与 CDN 结合&#xff0c;还可以实现在直播中的连麦互动、白板同步等强调实时性的场景。本文源自社区投稿&#xff0c;介绍了该场景下的一些基础知识。如…

暑期实习+秋招面经合集(更新ing)

大纲 开篇 自我介绍 &#xff1a;面试官你好&#xff0c;我叫林飞武&#xff0c;是一名通信工程大三学生&#xff0c;对计算机专业有着浓厚兴趣并且未来有志于在互联网的测试领域有深入发展。全套学习了计算机专业的专业课&#xff0c;计算机网络&#xff0c;操作系统等&#…

DNSPod十问王征:为什么你的网站无人问津?

&#x1f4e2; DNSPod十八周年庆将至&#xff0c;下期十问交给你来提问——《你&#xff0c;十问DNSPod》&#xff01;评论区留下你想问DNSPod团队的问题&#xff0c;一旦提问被选中&#xff0c;将得到十八周年纪念T恤&#xff01;详情请移步至DNSPod公众号十八周年庆推送。 广…

阿里云ACP认证考试笔记

课件&#xff1a;https://gitee.com/HanFerm/technical-documentation/tree/master/阿里云acp教材 本文档为公开内容 一、ACP是干嘛的 内容范围&#xff1a; 历史 二、阿里云综述 技术架构 优势 三、弹性计算 ECS ECS的组成与功能 ECS是由多个并列又相互关联的产品概念组成…

在互联网上,没有人知道你是一条狗?

1993 年&#xff0c;《纽约客》&#xff08;The New Yorker&#xff09;杂志刊登一则由彼得施泰纳&#xff08;Peter Steiner&#xff09;创作的漫画&#xff1a;标题是【On the Internet, nobody knows you’re a dog.】 这则漫画中有两只狗&#xff1a;一只黑狗站在电脑椅上…

分库分表和NewSQL如何选择?分库分表真的适合你的系统吗?

曾几何时&#xff0c;“并发高就分库&#xff0c;数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。 面试官喜欢问&#xff0c;博主喜欢写&#xff0c;候选人也喜欢背&#xff0c;似乎已经形成了一个闭环。 但你有没有思考过&#xff0c;分库分表真的适合你的系统吗&am…

分库分表不一定适合你的系统,聊聊分库分表和NewSQL如何选择

曾几何时&#xff0c;“并发高就分库&#xff0c;数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。 面试官喜欢问&#xff0c;博主喜欢写&#xff0c;候选人也喜欢背&#xff0c;似乎已经形成了一个闭环。 但你有没有思考过&#xff0c;分库分表真的适合你的系统吗&am…

分库分表真的适合你的系统吗?聊聊分库分表和NewSQL如何选择

曾几何时&#xff0c;“并发高就分库&#xff0c;数据大就分表”已经成了处理 MySQL 数据增长问题的圣经。 面试官喜欢问&#xff0c;博主喜欢写&#xff0c;候选人也喜欢背&#xff0c;似乎已经形成了一个闭环。 但你有没有思考过&#xff0c;分库分表真的适合你的系统吗&am…

分库分表和 NewSQL 到底怎么选?

文章来源&#xff1a;【公众号&#xff1a;CoderW】 目录 背景分表分库分库分表的成本NewSQLNewSQL 平滑接入方案NewSQL 真的有那么好吗&#xff1f;NewSQL 的应用分库分表和 NewSQL 到底怎么选&#xff1f; 背景 曾几何时&#xff0c;“并发高就分库&#xff0c;数据大就分表”…

软考初级-信息处理技术员

22年下半年也是顺利通过了软考初级-信息处理技术员&#xff0c;明年再报一次软设&#xff0c;今年上半年软设下午题没过&#xff0c;总结还是代码敲的少&#xff0c;想的太多hh&#xff0c;下面来看看我总结的上午题考点&#xff0c;非常感谢我好友老郑教我指点了我excel的函数…

学术交流 | InForSec 2023年网络空间安全国际学术研究成果分享及青年学者论坛

隐私计算研习社 InForSec定于2023年4月8日&#xff5e;9日&#xff08;周六、日&#xff09;在南方科技大学举办“InForSec 2023年网络空间安全国际学术研究成果分享及青年学者论坛”。本次学术活动将邀请在网络空间安全顶级会议上发表论文的研究者分享他们的最新研究成果&…

用matlab绘制光滑曲线(plot画出的为折线)

x[0 0.1 0.16 0.27 0.41 0.48 0.59 0.8] y[5 9 70 118 100 17 0 5]; 那么用plot画出的函数为折线&#xff0c;如下图&#xff1a; 要想把那个折点平滑掉。像论文中那样&#xff0c;具体采用样条函数&#xff1a;下面是样条函数的定义&#xff1a; spline function 一类分段&…

matlab plot画曲线/直线/椭圆

本博文源于matlab基础&#xff0c;每个图像一个案例引入&#xff0c;大家简单看&#xff0c;直接照猫画虎去套用就行了。 画直线 例子&#xff1a;画y2*x3 范围为[1,10] 代码&#xff1a; >> x1:10; >> y2*x3; >> plot(y) >> 画曲线 在区间[-Π,Π…

Matlab图形绘制(一)三维曲线

文章目录 1.三维曲线常用函数第一个例子第二个例子第三个例子&#xff1a;&#xff08;更改线性&#xff0c;颜色&#xff09;第四个例子&#xff1a;&#xff08;有返回值的情况&#xff09; 1.三维曲线常用函数 plot3函数&#xff0c;用于绘制3D图形的一个非常常用的函数。 …

【MATLAB】动态绘制曲线图(二维曲线)

先看效果✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 主程序&#xff1a; 加载数据的部分我省略了&#xff0c;就是data1这个矩阵 close all; X1:25; set(gcf,unit,normalized,position,[0.3,0.25,0.5,0.5]); %figure窗口位置、大小设置 ylabel(人数) xlabel(日期) title(2022年11月重庆…

MATLAB----绘制三维曲线

参考于:中国大学慕课科学计算于MATLAB语言专题四“4.4三维曲线” 1.plot3函数 plot3(x,y,z,选项) plot3用来绘制三维曲线&#xff0c;与plot用法类似。当x&#xff0c;y&#xff0c;z为同型矩阵时&#xff0c;以x&#xff0c;y&#xff0c;z对应列绘制曲线&#xff0c;曲线条…

matlab画平滑曲线的两种方法

自然状态下&#xff0c;用plot画的是折线&#xff0c;而不是平滑曲线。 有两种方法可以画平滑曲线&#xff0c;第一种是拟合的方法&#xff0c;第二种是用spcrv&#xff0c;其实原理应该都一样就是插值。下面是源程序&#xff0c;大家可以根据需要自行选择&#xff0c;更改拟合…

matlab参数方程画曲线

求x2 - 3x 1 0 x -5:0.1:5; y1 x.x-3x1; y2zeros(size(x)); plot(x,y1,x,y2); f (x) xx-3x1 x1fzero(f,0.5) x2 fzero(f,2.5) x [0.2,1.8,2.5] y [1.3,2.8,1.1] z [0.4,1.2,1.6] plot3(x,y,z) grid on axis([0,3,1,3,0,2]) t linspace(0,10*pi,200) %生成有200个元素…