【数据结构】——多项式乘法

article/2025/8/15 4:16:50

题目要求

从字符文件输入两个多项式的非零系数及对应的指数,建立多项式的链式存储结构,计算这两个多项式的乘积,输出乘积多项式的全部非零系数及对应的指数到另一字符文件中。

算法原理

两个多项式的乘法,可以借助两个多项式的加法的算法来实现。

设:

                                                           P(x) = a_{0}x^{b_{0}} + a_{1}x^{b_{1}} + \cdot \cdot \cdot + a_{m-1}x^{b_{m-1}}

                                                           Q(x) = c_{0}x^{d_{0}} + c_{1}x^{d_{1}} + \cdot \cdot \cdot + c_{n-1}x^{d_{n-1}}

则:

                                                            R(x) = P(x) \cdot Q(x) = \sum_{i = 0}^{n-1}P(x)c_{i}x^{d_{i}}

例如:    P(x) = 8x^{2}-x+5,      Q(x) = 4x^{2}-9,

则:

                           R(x) = P(x)\cdot Q(x) = (8x^{2}-x+5)\cdot (4x^{2}) + (8x^{2}-x+5)\cdot (-9) = (32x^{4} - 4x^{3}+20x^{2}) + (-72x^{2}+9x-45) = 32x^{4} - 4x^{3} -52x^{2}+9x-45

数据结构设计

采用带附加头结点单向链表;每个结点包括双精度类型的系数域、整型类型的指数域和一个指针域。

typedef struct polynode
{double c;			//系数int e;				//指数struct polynode *next;		//指针域,要求结点按指数e升序连接
}PNode,*Polyn;                          //PNode为结点类型,Polyn为结点指针类型

程序代码

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;
//定义结点及结点指针数据类型
typedef struct polynode
{double c;			        //系数int e;				        //指数struct polynode *next;		        //要求结点按指数e升序连接
}PNode,*Polyn;                                  //PNode为结点类型,Polyn为结点指针类型
Polyn h1, h2;					//两个多项式P(x),Q(x)的头结点
double a[20];					//数组a保存系数
int b[20];				        //数组b保存指数
void Read(char *s)		 		//读取数据,s代入不同的文件名
{double c;int i = 0, e;ifstream infile(s);if (!infile)				//打开文件失败输出提示信息{cout << "file open error!" << endl;exit(0);}while (1)                               //打开成功,将系数和指数保存在两个数组中{infile >> c >> e;if (infile.eof())break;a[i] = c;b[i] = e;i++;}infile.close();			
}
void Write(Polyn h)				//输出函数,将结果输出到文件中,h为链表头结点
{ofstream outfile("multiply.txt");       //输出文件名为multiply.txtPolyn p = h->next;                      //去掉附加头结点if (!outfile)				//打开文件失败输出提示信息{cout << "file open error!" << endl;exit(0);}if (!p)			                //第一个结点为空,表示运算结果为0outfile << "0" << endl;while (p)			        //p不为空,依次输出系数和指数{outfile << p->c << "     " << p->e << endl;p = p->next;}outfile.close();
}void clearArray() {             //清空数组memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));
}Polyn Create(char *s)			        //先入先出建立链表,s代入不同的文件名
{int i = 0;                             //i用于记录数组下标Polyn h, last, p;h = new PNode;h->next = NULL;                        //h为附加头结点last = h;clearArray();Read(s);                               //从文件中读取系数和指数while (a[i]!=0){p = new PNode;p->c = a[i];p->e = b[i];p->next = NULL;		      //建新结点last->next = p;last = p;                     //新结点插入到链表尾i++;}return h;
}void PrintPoly(Polyn h)                        //按多项式的形式将结果打印到控制台界面中
{Polyn p = h->next;if (!p)                               //所得结果为空,则输出0cout << "0" << endl;while (p){if (p->next)                     //p不是尾结点{if (p->next->c < 0)         //p的后继结点的系数小于0,不输出符号 + {if (p->c == -1)     //p的后继结点的系数等于-1{cout << "-x^" << p->e;p = p->next;}else if (p->c == 1) //p的后继结点的系数等于1{cout << "x^" << p->e;p = p->next;}else{cout << p->c << "x^" << p->e;p = p->next;}}else if (p->next->c > 0)       //p的后继结点的系数大于0,需输出符号+{if (p->c == 1)         //p的后继结点的系数等于1{cout << "x^" << p->e << "+";p = p->next;}else if (p->c == -1)   //p的后继结点的系数等于-1{cout << "-x^" << p->e << "+";p = p->next;}else{cout << p->c << "x^" << p->e << "+";p = p->next;}}}else                               //p是尾结点,需在结尾输出换行{if (p->c < 0)              //p的指数小于0{if (p->c == -1){cout << "-x^" << p->e << endl;p = p->next;}else{cout << p->c << "x^" << p->e << endl;p = p->next;}}else if (p->c > 0)         //p的指数大于0{if (p->c == 1){cout << "x^" << p->e << endl;p = p->next;}else{cout << p->c << "x^" << p->e << endl;p = p->next;}	}	}}
}
void CreateNode(Polyn &p)			//创建新结点
{p = new PNode;
}
void DeleteNode(Polyn &p)			//删除结点
{delete p;
}
Polyn add(Polyn h1, Polyn h2)                   //实现两个多项式的相加,返回和式头指针
{Polyn p1, p2, p3, h, p;			//h为和式R(x)的附加头结点指针p1 = h1->next;p2 = h2->next;CreateNode(h);p3 = h;while (p1&&p2){if (p1->e < p2->e)              //p1的指数大于p2,先保存p1结点{p = p1;p1 = p1->next;}else if (p2->e < p1->e)         //p2的指数大于p1,先保存p2结点{p = p2;p2 = p2->next;}else                             //p1与p2指数相等时{p1->c += p2->c;         //系数相加,结果保存在p1中if (p1->c == 0)         //系数之和为0,则删除该结点{p = p1;p1 = p1->next;DeleteNode(p);        //删除结点p = p2;p2 = p2->next;DeleteNode(p);continue;}p = p2;                 //系数之和不为0时,先删除p2结点p2 = p2->next;DeleteNode(p);p = p1;                 //将p1连接到p中p1 = p1->next;}p3->next = p;                 //插入p结点至和式末尾p3 = p;}if (p1)                              //p1没有结束,将p1后面所有的结点连接到和式p3->next = p1;else if (p2)                         //p2没有结束,将p2后面所有的结点连接到和式p3->next = p2;elsep3->next = NULL;h1->next = h2->next = NULL;         //清空h1和h2链表return h;
}
Polyn mul(Polyn hp, Polyn hq)		    //实现两个多项式的相乘
{Polyn hr, ht, q, p, pt;CreateNode(hr);hr->next = NULL;                     //R(x) = 0CreateNode(ht);ht->next = NULL;                     //T(x) = 0q = hq->next;while (q){pt = ht;p = hp->next;while (p){CreateNode(pt->next);	//创建新的尾结点pt = pt->next;pt->c = p->c*q->c;      //系数相乘pt->e = p->e + q->e;    //指数相加p = p->next;}pt->next = NULL;q = q->next;p = add(hr, ht);                 //实现R(x) = R(x) + T(x)DeleteNode(hr);hr = p;}DeleteNode(ht);return hr;
}
int main()
{Polyn h1, h2, h3;                     //定义单向链表附加头结点指针cout << "读取文件,直到读入0时停止,建立单向链表" << endl;h1 = Create("polynode1.txt");h2 = Create("polynode2.txt");cout << "P(x) = ";PrintPoly(h1);cout << "Q(x) = ";PrintPoly(h2);h3 = mul(h1, h2);cout << "R(x) = P(x) * Q(x) = ";PrintPoly(h3);Write(h3);                             //写入文件return 0;
}

示例

 (1)  P(x)   1   2    2   3     0

       Q(x)  1  -2    2  -3     0

输出结果为:

                                                   

(2)P(x)     1  1      2  2      3  3      0

         Q(x)    -1  1    -2  2     -3  3      0

输出结果为:

                                               


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

相关文章

多项式乘法(FFT)详解

本文只探讨多项式乘法(FFT)在信息学中的应用 如有错误或不明欢迎指出或提问&#xff0c;在此不胜感激 多项式 1. 系数表示法 一般应用最广泛的表示方式 用A(x)表示一个x-1次多项式&#xff0c;a[i]为 xi x i 的系数&#xff0c;则A(x) ∑n−10 ∑ 0 n − 1 a[i] * xi x i…

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

多项式乘法与加法运算 设计函数分别求两个一元多项式的乘积与和题意理解题意理解和积 求解思路多项式表示两种表示方式在事先已经知道具体多少项的时候&#xff0c;本题较好的实现方法&#xff1a;动态数组链表表示多项式的方法 程序框架如何读入多项式读入多项式的完整程序 加…

多项式乘法问题

多项式乘法问题 实验目的&#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;曲线条…