Exp01 多项式乘法问题

Author: Maskros

实验目的

设计一个一元稀疏多项式简单计算器

实验内容与要求

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

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

(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,...,cn,enn,c_1,e_1,c_2,e_2,...,c_n,e_nn,c1​,e1​,c2​,e2​,...,cn​,en​, 其中 nnn 是多项式的项数,cic_ici​ 和 eie_iei​ 分别是第 iii 项的系数和指数,序列按指数 降序排列。

(3)多项式 aaa 与多项式 bbb 相乘,建立多项式。

实验内容和实验步骤

在这里我们分别通过顺序表和链表两种方法来实现实验要求

  • 大体思路:

    • 链表 O(N2)O(N^2)O(N2):

      • 结构体Pol存储多项式每项的系数和指数
      • CreatePol(Pol *&head)函数用于接收输入的多项式元素,创建一个多项式
      • PrintPol(Pol *&head)函数用于打印多项式
      • MultiPol(Pol *&a, Pol *&b, Pol *&c)函数用于实现多项式的乘法,每次插入一项顺序遍历新链表 ,按指数升序插入或合并,最后得到以 *c为头结点的链表,即所求结果
      • Getlength(Pol &pol)函数遍历链表返回多项式的项数,用于打印时使用
      • ps:计算出来是空项的判断依据为 pol->c=0 , 故在输出和计算长度时将其直接忽略
    • 顺序表 O((logN)2)O((logN)^2)O((logN)2):
      • 使用定义的map类型 typedef map<int, int> Pol存储多项式每项的系数和指数, key为指数,value为系数,map.size()为多项式项数
      • create()函数用于接收输入的多项式元素,创建一个多项式
      • print(Pol &pol)函数用于打印多项式
      • multi(Pol &p1, Pol &p2)函数用于实现多项式的乘法,完成合并后,返回一个Pol类型的多项式
      • 使用map的好处:由于map遍历的特性,不用再次从小到大排序,并且易于查找和合并同类项
  • 输入形式:两个多项式,两个整数序列 n,c1,e1,c2,e2,...,cn,enn,c_1,e_1,c_2,e_2,...,c_n,e_nn,c1​,e1​,c2​,e2​,...,cn​,en​, 其中 nnn 是多项式的项数,cic_ici​ 和 eie_iei​ 分别是第 iii 项的系数和指数,序列按指数 降序排列
  • 输出形式:一个整数序列 n,c1,e1,c2,e2,...,cn,enn,c_1,e_1,c_2,e_2,...,c_n,e_nn,c1​,e1​,c2​,e2​,...,cn​,en​,标号规则同上

链表实现

//presented by Maskros - 2021/03/31
#include<bits/stdc++.h>
using namespace std;
struct Pol{int c;   //coefficientint e; //exponentPol *next;
};
int Getlength(Pol *&head){  //Calculate the number of terms in a polynomialif(head==NULL) {cout<<"NO_ELEM_ERROR"<<endl; return 0;}Pol *p=head;int cnt=0;while(p->next!=NULL){p=p->next;if(p->c==0) cnt--;    //Empty items are not included in the countcnt++;}return cnt;
}void CreatePol(Pol *&head){    //Create a polynomial//initializationhead=(Pol *) new Pol;head->c=0;head->e=0;head->next=NULL;Pol *pol=head;int n; cin>>n;for(int i=1;i<=n;i++){pol->next=(Pol *) new Pol;  pol=pol->next;cin>>pol->c>>pol->e;pol->next=NULL;}return;
}
void PrintPol(Pol *&head){  //Print polynomial  Pol *p=head;int n=Getlength(p);cout<<n<<" ";while(p->next!=NULL){p=p->next;if(p->c!=0) cout<<p->c<<" "<<p->e<<" ";  //Do not print empty items}return;
}
void MultiPol(Pol *&a, Pol *&b, Pol *&c){   //Polynomial multiplicationPol *p1=a, *p2=b;int tmpc,tmpe;bool t;     //Check if the item has been insertedc=(Pol *) new Pol;c->c=0; c->e=0; c->next=NULL;   //initializationPol *p3,*pre;   //$pre$ is the node before the current positionwhile(p1->next!=NULL){p1=p1->next;p2=b;while(p2->next!=NULL){p2=p2->next;t=false;tmpc=p1->c*p2->c;tmpe=p1->e+p2->e;p3=c;pre=c;while(p3->next!=NULL){  p3=p3->next;if(p3->e>tmpe){       //The insertion position is before the current positionpre->next=(Pol *)new Pol;pre=pre->next;pre->e=tmpe;pre->c=tmpc;pre->next=p3;t=true;}else if(p3->e==tmpe){  //Combine similar items at current locationp3->c+=tmpc;t=true;}else if(p3->next!=NULL && p3->e<tmpe && p3->next->e>tmpe){  //The insertion position is after the current positionpre=p3->next;p3->next=(Pol *)new Pol;p3=p3->next;p3->e=tmpe;p3->c=tmpc;p3->next=pre;t=true;}if(t==true) break;pre=p3;}if(t==false){ //Insertion position is at the end of the linked listp3->next=(Pol *)new Pol;p3=p3->next;p3->e=tmpe;p3->c=tmpc;p3->next=NULL;}}}return ;
}
int main(){Pol *p1,*p2,*p3;p1=NULL,p2=NULL,p3=NULL;CreatePol(p1);CreatePol(p2);MultiPol(p1,p2,p3);PrintPol(p3);return 0;
}

顺序表实现

//presented by Maskros - 2021/03/31
#include<bits/stdc++.h>
using namespace std;
typedef map<int, int> Pol;
Pol p1,p2,p3;
void create(Pol &pol){  //Create a polynomialint co,ex,n;cin>>n;for(int i=1;i<=n;i++){cin>>co>>ex;pol[ex]+=co; }
}
void print(Pol &pol){   //Print polynomialmap<int,int>::iterator it;cout<<pol.size()<<" ";for(it=pol.begin();it!=pol.end();it++){cout<<it->second<<" "<<it->first<<" ";  }
}
Pol multi(Pol &p1, Pol &p2){    //Polynomial multiplicationPol p3;map<int,int>::iterator it1,it2;for(it1=p1.begin();it1!=p1.end();it1++){for(it2=p2.begin();it2!=p2.end();it2++){p3[it1->first+it2->first]+=it1->second*it2->second;       //Insert p3 after multiplying directlyif(p3[it1->first+it2->first]==0) p3.erase(it1->first+it2->first); //Delete extra items}}return p3;
}
int main(){create(p1);create(p2);p3=multi(p1,p2);print(p3);return 0;
}

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

INPUT1:
2 1 2 3 4
3 1 3 1 5 2 6
OUTPUT1:
5 1 5 4 7 2 8 3 9 6 10INPUT2:
3 2 0 3 2 4 3
3 -1 0 1 1 4 3
OUTPUT2:
7 -2 0 2 1 -3 2 7 3 4 4 12 5 16 6IUPUT3:
3 -1 -1 1 0 1 1
2 2 -2 3 2
OUTPUT3:
6 -2 -3 2 -2 2 -1 -3 1 3 2 3 3INPUT4:
2 1 0 1 1
2 -1 0 1 1
OUTPUT4:
2 -1 0 1 2
  • 结果分析:由此可见,无论是错序合并,系数、项数取正、负、零,以及结果出现零项的处理均可实现,输出正确答案

实验总结

  • 链表写起来比较基础,对于插入、遍历、删除等操作无法取巧,包括在计算多项式的长度时都需要遍历,只能扎扎实实来写,排序的工作在插入的时候直接就按照顺序插入来完成,如果数据量比较大的话感觉时间复杂度有点高,所以有点小麻烦,但是感觉写下来一趟,强化了我对于指针、地址、空间等方面的理解,写起来也没有之前那么生疏了
  • 顺序表一开始打算用 struct 型的 vector 来存,然后直接插入,最后再sort()一下方便排序,结果在相同项合并的操作上发现还是需要像链表一样遍历去查找位置,所以感觉有点麻烦,本来写好了就全删了,换了一种思路,用 map 来实现
    式的长度时都需要遍历,只能扎扎实实来写,排序的工作在插入的时候直接就按照顺序插入来完成,如果数据量比较大的话感觉时间复杂度有点高,所以有点小麻烦,但是感觉写下来一趟,强化了我对于指针、地址、空间等方面的理解,写起来也没有之前那么生疏了
  • 顺序表一开始打算用 struct 型的 vector 来存,然后直接插入,最后再sort()一下方便排序,结果在相同项合并的操作上发现还是需要像链表一样遍历去查找位置,所以感觉有点麻烦,本来写好了就全删了,换了一种思路,用 map 来实现
  • 用 map 太爽了,30来行就完事了,不用手动排序,查找合并也很方便,除了加了一个空项的erase()删除工作,基本上没什么坑,遍历也很舒服,stl永远滴神

数据结构实验一:多项式乘法问题相关推荐

  1. 实验:多项式乘法问题

    实验目的:设计一个一元稀疏多项式简单计算器. 实验内容与要求   一元稀疏多项式简单计算器的基本功能是:   (1)输入并建立多项式:   (2)输出多项式,输出形式为整数序列:n,c1,e1,c2, ...

  2. 一元稀疏多项式乘法问题

    一元稀疏多项式简单计算器 实验题目 实验目的 实验内容与要求 实验内容和实验步骤 需求分析 概要设计 调试分析 调试过程中所遇到问题及解决方案 算法的时空分析 代码分析 数据结构 函数模块 建立空多项 ...

  3. 数据结构实验报告三:教材3.10Josephus(约瑟夫环)问题、多项式乘法问题的求解

    实验三:教材3.10Josephus(约瑟夫环)问题.多项式乘法问题的求解 问题一·教材3.10Josephus问题 1.实验描述 N个人从1到N编号,围坐成一个圆圈.从1号开始传递一个热土豆.经过M ...

  4. 多项式相加减【数据结构实验报告】

    实验名称:实验一 多项式加减法 学号:*** 姓名:gnosed 实验日期:2017.10.16 一.实验目的 通过实现多项式的加减法,对链表有更深入的了解 二.实验具体内容 1.实验题目1: (1) ...

  5. 数据结构实验:一元多项式计算器

    一.实验内容及要求 1.任务描述: 实验内容: 设有一元多项式Am(x)和Bn(X),编程实现多项式Am(x)和Bn(x)的加法.减法和乘法运算.其中多项式描述为: Am(x)=A0+A1x1+A2x ...

  6. 数据结构实验-稀疏一元多项式计算

    (实验)自行为稀疏一元多项式设计存储结构,并实现如下功能: ① 输入:从键盘输入多项式的各项系数和指数,创建一元多项式: ② 输出:按给定格式输出一元多项式:(例如:3*x20-x7+10) ③ 多项 ...

  7. C语言程序设计-多项式乘法系统模拟系统01

    多项式乘法系统模拟(难度3) [问题描述] 编写一个实现多项式乘法系统模拟的c语言程序 [基本要求] 1).输入第一个多项式P(X)=pm-1Xm-1+--+p1X+p0. 2).输入第二个多项式Q( ...

  8. 数据结构实验--双向链表及其应用

    数据结构实验一: 实验要求: 1.编写使用freelist的带头.尾节点的双向链表类的定义,实现双向链表的基本操作. 2.利用双向链表实现2个一元多项式的加法和乘法运算,运算结果得到的链表要求按照指数 ...

  9. 解题报告(二)多项式问题(多项式乘法及其各种运算)(ACM/ OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

最新文章

  1. NeurIPS 2020 | FixMatch:通过图像增强就能实现半监督学习
  2. 转: 七牛云的开源播放器的使用指南
  3. Javascript重温OOP之原型与原型链
  4. axios (get post请求、头部参数添加)傻瓜式入门axios
  5. 富士通01018z平板电脑评测_档案扫描好帮手,富士通ix1500无线双面高速扫描仪评测...
  6. 关于房屋的风水学整理
  7. maven Web项目添加数据源支持,包括Oracle、Mysql
  8. android不同机型编译不同so,如何使用adb命令查看android中的数据库
  9. mysql创建数据库与表_PHP MySQL 创建数据库和表 之 Create
  10. 《统计学习方法》代码全解析——第十三部分无监督学习概论
  11. 你的早鸟票特权仅剩2天!百度、快手、商汤、图森等重磅嘉宾确认出席AI ProCon 2019...
  12. ctf-希尔伯特曲线隐写
  13. 黑马程序员-微信小程序-原生框架——购物平台-首页
  14. 光纤测试之常见光纤端面问题
  15. 网络连接不正常是什么原因
  16. 2022-03-25 redis哨兵处理failover
  17. windows和linux共用蓝牙鼠标,Ubuntu和Windows双系统蓝牙设备共享配对
  18. 基于LSTM三分类的文本情感分析,采用LSTM模型,训练一个能够识别文本postive, neutral, negative三种
  19. k8s访问外部mysql_Kubernetes连接外部数据源
  20. 100集华为HCIE安全培训视频教材整理 | Agile Controller终端安全管理特性(二)

热门文章

  1. cartographer导航的时候更新地图
  2. 私域是否是数字化中的必要的一环?
  3. 如果你的车上的导航GPS新地图搜不到星,请看这
  4. 2023 年第八届数维杯数学建模挑战赛 赛题浅析
  5. 这台计算机现在在博物馆吗英语翻译,2018年12月英语六级翻译真题及答案:博物馆...
  6. Netra基于Rdk平台的软件框架设计
  7. C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2022架构师篇完整版)
  8. 关于Mac安装淘宝镜像报错
  9. 阿里云服务器(Linux)如何修改远程登录端口22?
  10. 易语言类返回数组问题