多项式乘法问题

article/2025/8/15 6:16:47

多项式乘法问题

实验目的:设计一个一元稀疏多项式简单计算器。

实验内容与要求

一元稀疏多项式简单计算器的基本功能是:

(1)输入并建立多项式;

(2)输出多项式,序列按指数降序排列。

(3)多项式a与多项式b相乘,建立多项式。

实验内容和实验步骤:

概览:

输入:a项的项数以及分别输入每项的系数和指数,可以不按指数的大小乱序输入,可以输入多项带有相同指数的项(程序会将其自动累加);项数c是float型(输出时保留一位小数),指数e是int型。

输出:相乘的结果。结果按指数的大小降序排列,其中的项的系数若是负号,则不输出加号,系数为0的项删除,指数为1的项只输出该项系数而不输出x。题目要求的输出太过简略,而本程序输出比题目要求更加直观易懂,但实现起来更为复杂,下面再来讨论。

设计概要:

从主函数进入后,先初始化链表。再依次用循环输入数据并以此建立a、b两个链表。每建立一个链表,用check函数检查并删掉多余项,最后用multiple函数求积(内置check函数删掉多余项),通过toString函数输出答案。

本程序采用链表实现:链表单元是PNode;cmp用来比较排序(用于insertList);insertList用来输入多项式(按照指数的降序顺序排列);checkList用来遍历检查链表,若发现系数为0的项就将其剔除(用于运算操作之后),multiple用来实现乘法运算,toString用来打印多项式。

注:为了使输入和输出看起来更加舒服,toString输出的格式更符合人们的习惯,比如:

x^2 - 2x^1 + 1

15.0x^3 + 16.0x^2 + 9.0x^1 + 2.0

以下是程序的详细说明:

#include<iostream>
using namespace std;
typedef struct PNode { //定义链表中的节点float c; //系数int e; //指数struct PNode *next;
}PNode, *PNodeList;void InitList(PNodeList &l) {//初始化链表函数,为链表加一个头节点//头节点只是指向作用,其系数指数均为0l = new PNode();
}int cmp(PNodeList a, PNodeList b) {return b->e - a->e;
}void insertList(PNodeList &L, float c, int e) {//插入新节点,以指数的降序顺序排列。int status = 1; //用来指示节点是否在中途插入,也可以用bool型变量来表示PNodeList p = L;PNodeList temp = new PNode(); //初始化要插入的节点temp->c = c;temp->e = e;while (p->next != NULL) {if (cmp(temp, p->next)<0) { //如果要插入的节点比后一个大,则将其插在后一个之前。temp->next = p->next;p->next = temp;status = 0;break;}else if(!cmp(temp, p->next)){ //如果要插入的节点等于后一个节点,则只改变后一个节点系数即可。p->next->c += c;status = 0;break;}p = p->next;}if (status) {//要插入的节点比所有的节点小。则放在链表最后即可。p->next = temp; }
}//双for循环遍历两表,将结果依次加入结果
void multiple(PNodeList a, PNodeList b, PNodeList c) {//用来检查并删掉系数为0的项PNodeList pa = a;PNodeList pb = b;if (pa->next == NULL || pb->next == NULL) return; //若a、b为0,则直接退出for (pa = a; pa->next != NULL;) {pa = pa->next;for (pb = b; pb->next != NULL;) {pb = pb->next;insertList(c, pa->c*pb->c, pa->e + pb->e);}
void checkList(PNodeList c) {//用来检查并删掉系数为0的项PNodeList delete_node;while (c != NULL&&c->next != NULL) {//这里要考虑到两种情况:末尾节点和非末尾节点if (c->next->c == 0) {delete_node = c->next;c->next = delete_node->next;delete[] delete_node;}c = c->next;}
}void toString(PNodeList L) { //打印链表if (L->next == NULL) {printf("\n");}else {L = L->next;if(L->e==0)printf("%.1f", L->c);elseprintf("%.1fx^%d", L->c, L->e);L = L->next;while (L != NULL) {if (L->e == 0) {if (L->c > 0) printf(" +");printf(" %.1f", L->c);}else {if (L->c > 0) printf(" +");printf(" %.1fx^%d", L->c, L->e);}L = L->next;}}printf("\n");
}int main() {PNodeList a,b,c;InitList(a);InitList(b);InitList(c);int n1, n2;cout << "请输入a表中的多项式项数:";cin >> n1;cout << "请依次输入a表中的系数和指数:" << endl;for (int i = 0; i < n1; i++) {printf("第%d项的系数和指数分别是:",i + 1);float c;int e;cin >> c;cin >> e;insertList(a, c, e);}checkList(a);cout << "您输入的a式是:" << endl;toString(a);cout << "请输入b表中的多项式系数:";cin >> n2;cout << "请依次输入b表中的系数和指数:" << endl;for (int i = 0; i < n2; i++) {printf("第%d项的系数和指数分别是:", i + 1);float c;int e;cin >> c;cin >> e;insertList(b, c, e);}checkList(b);cout << "您输入的b式是:" << endl;toString(b);cout << "相乘的结果为:" << endl;multiple(a, b, c);toString(c);return 0;
}

实验用测试数据和相关结果分析:

例如:

在这里插入图片描述

(输入相同指数其的系数自动合并,输入的项若系数相消为0,则将其删去)

在这里插入图片描述

该程序的时间复杂度是O(N^2),因为在计算时有两个for循环;

空间复杂度为O(N),因为只存在单向链表。

**实验总结:**总的来说,本程序通过链表来实现了多项式的乘法运算(加法减法也是同理),其本质是利用了链表易于增删改查以及容量可变的特性。在此基础上,我优化了程序的输入和输出格式,使其更加简单明了。


http://chatgpt.dhexx.cn/article/09cnBZIB.shtml

相关文章

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

网络视频直播存在已有很长一段时间&#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个元素…

matlab,多条曲线画到一张图上

在matlab中&#xff0c;经常遇到画图问题&#xff0c;甚至&#xff0c;有时候需要把其他软件中的数据&#xff0c;导出来&#xff0c;用matlab处理。 此处给出&#xff0c;用matlab处理数据的一些简单方法。 1&#xff09;matlab加载excel文件 首先&#xff0c;数据在excel中&a…