02-线性结构2 一元多项式的乘法与加法运算

news2024/11/24 21:04:16

一个小时敲,五分钟改错。比一年前进步还是很大的。

但是如果测试点没有提示的话,改到哪年就不一定了( ´◔︎ ‸◔︎`)

思路

多项式加法,极其类似Merge

(测试点2:系数加完要是0的话就不用添入结果多项式里了~)

多项式乘法,逐项相乘,看看在结果多项式里是合并同类项还是新添一项

(测试点1:合并完如果系数为0,要在结果多项式中remove这一项)

 code

# include <iostream>
# include <string>

struct item {
	int a; //系数
	int n; //指数
};

struct listNode {
	item data;
	listNode * pred, *succ;
	listNode(){}
	listNode(item d, listNode* p, listNode* s) : data(d), pred(p), succ(s){}
	void insertAsPred(item val)
	{
		listNode* tmp = new listNode(val, pred, this);
		pred->succ = tmp;
		pred = tmp;
	}
	void insertAsSucc(item val)
	{
		listNode* tmp = new listNode(val, this, succ);
		succ->pred = tmp;
		succ = tmp;
	}
};

struct Poly { //多项式类
	listNode *head, *tail;
	int size;

	Poly() : size(0)
	{
		head = new listNode;
		tail = new listNode;
		head->pred = NULL; head->succ = tail;
		tail->pred = head; tail->succ = NULL;
	}

	void insertAsLast(item val) //尾部追加
	{
		++size;
		tail->insertAsPred(val);
	}

	void print()
	{
		if (size == 0) std::cout << "0 0\n";

		listNode * p = head->succ;
		int _size = size;
		while (_size--)
		{
			std::string str_tail = _size == 0? "\n" : " ";
			std::cout << p->data.a << " " << p->data.n << str_tail;
			p = p->succ;
		}
	}

	void add(Poly const & P2, Poly & sum) //加和放入sum
	{
		listNode *point1 = head->succ, *point2 = P2.head->succ;
		while (point1 != tail && point2 != P2.tail)
		{
			if (point1->data.n > point2->data.n)
			{
				sum.insertAsLast(point1->data);
				point1 = point1->succ;
			}
			else if (point1->data.n < point2->data.n)
			{
				sum.insertAsLast(point2->data);
				point2 = point2->succ;
			}
			else
			{
				if (point1->data.a + point2->data.a != 0) //attention!!!
					sum.insertAsLast(item{point1->data.a+point2->data.a, point1->data.n});
				point1 = point1->succ;
				point2 = point2->succ;
			}
		}
		while (point1 != tail)
		{
			sum.insertAsLast(point1->data);
			point1 = point1->succ;
		}
		while (point2 != P2.tail)
		{
			sum.insertAsLast(point2->data);
			point2 = point2->succ;
		}
	}
	void times(Poly const & P2, Poly & product) //加和放入product
	{
		for (listNode * point1 = head->succ; point1 != tail; point1 = point1->succ)
		{
			for (listNode * point2 = P2.head->succ; point2 != P2.tail; point2 = point2->succ)
			{
				item tmp{ point1->data.a * point2->data.a, point1->data.n + point2->data.n };
				product.insert(tmp, product.search(tmp.n));
			}
		}
	}

	listNode * search(int n) //n是指数,按指数查找
	{
		listNode * p = head->succ;
		while (p != tail && p->data.n > n) //跳出时,要么等于,要么小于,要么是tail,在insert函数中,累加,或向前插入
		{
			p = p->succ;
		}
		return p;
	}
	void insert(const item & val, listNode * p) //多项式插入(有合并功能)
	{
		if (p != tail && p->data.n == val.n)
		{
			p->data.a += val.a;
			if (p->data.a == 0) remove(p);
		}
		else
		{
			p->insertAsPred(val);
			++size;
		}
	}
	void remove(listNode * p)
	{
		p->pred->succ = p->succ;
		p->succ->pred = p->pred;
		--size;
		delete p;
	}
};
int main(void)
{
	Poly P1, P2;

	// 输入两个多项式(高次项在头,低次项在尾)

	int K, a, n;
	std::cin >> K;
	while (K--) { std::cin >> a >> n; P1.insertAsLast(item{ a, n }); }

	std::cin >> K;
	while (K--) { std::cin >> a >> n; P2.insertAsLast(item{ a, n }); }


	// 计算

	Poly sum;
	P1.add(P2, sum);

	Poly product;
	P1.times(P2, product);


	// 输出两个结果多项式

	product.print();
	sum.print();
	

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/770871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

业务安全分析第19期 | 今年暑假,博物馆的门票为什么抢不到?

目录 “黄牛”&#xff1a;加价代预约、加价售票、兜售野导游套餐 “黄牛”倒票带来的危害 “黄牛”为什么能够抢到票 博物馆与“黄牛”的门票攻防 “黄牛”使用的作弊软件有什么特征 技术上防范“黄牛”的作弊软件抢票 遏制“黄牛”倒票给博物馆带来的收益 随着暑期参观…

电影《碟中谍7:致命清算(上)》观后感

上周看了电影《碟中谍7&#xff1a;致命清算&#xff08;上&#xff09;》&#xff0c;从电影名称就知道&#xff0c;这部电影会有下部&#xff0c;讲述科学进步之后&#xff0c;有AI引发的技术变革&#xff0c;出现了一种AI变体叫做智体的东西&#xff0c;它有自主意思&#x…

【代码随想录 | Leetcode | 第八天】哈希表 | 有效的字母异位词 | 两个数组的交集 | 两数之和

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来哈希法~有效的字母异位词 | 两个数组的交集 | 两数之和的分享✨ 目录 前言242. 有效的字母异位词349. 两个数组的交集1. 两数之和总结 242. 有效的字母异位词 ✨题目链接点这里 给定两个字符串…

【Vue/element】 el-table实现表格动态新增/插入/删除 表格行,可编辑单元格

el-table实现表格动态新增/插入/删除 表格行&#xff0c;可编辑单元格 效果如下&#xff1a; 点击“新增一行”可以在表格最后新增一行&#xff0c;单元格内容可编辑 点击绿色按钮&#xff0c;可在指定行的后面插入一行 点击红色-按钮&#xff0c;可以删除指定行 原理&#…

【Spring 】执行流程解析:了解Bean的作用域及生命周期

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 Spring 项目的执行流程解析 和 Bean 对象的6 种作用域以及生命周期&#xff0c;本文将为大家讲解&#xff0c;一起来看看叭~ 本期收录于博主的专栏&#xff1a;JavaEE_保…

那些你必须知道的4个matlab小技巧(附最新安装包)

文末福利&#xff1a;MATLAB R2022b软件安装包 MATLAB 简介 01 一、MATLAB简介 数学类科技应用软件包括数值计算&#xff08;Number Crunching&#xff09;型软件和数学分析&#xff08;Math Analysis&#xff09;型软件 数值计算型软件 它们对大批数据具有较强的管理、计…

数据仓库建设-数仓分层

数据仓库能够帮助企业做出更好的决策&#xff0c;提高业务效率和效益&#xff1b;在数据仓库建设时&#xff0c;绕不开的话题就是数仓分层。 一、数据分层的好处 1. 降低数据开发成本 通用的业务逻辑加工好&#xff0c;后续的开发任务可以基于模型快速使用&#xff0c;数据需…

分布式定时任务组件:XXL-JOB

一、GitHub源码地址 https://github.com/xuxueli/xxl-job 二、部署文档 参考&#xff1a;https://blog.csdn.net/qq798867485/article/details/131415408 三、初始化数据库SQL 1、xxl_job_user XxlJob-用户管理 2、xxl_job_group XxlJob-执行器管理 3、xxl…

vue3+vite+pinia+vue-router+ol项目创建及配置

一、vite (一)、定义 vite官网 (二)、操作步骤 注意&#xff1a;两种方式创建目录结构一致 方式一&#xff1a;vite创建脚手架命令&#xff1a; 命令行&#xff1a;npm create vitelatest 然后选择 方式二&#xff1a;命令行直接声明带上vue 二、pinia (一)、定义 定义&#xf…

TortoiseGit 入门指南12:创建标签

前面的文章不止一次的提到过 标签 &#xff08;Tag&#xff09;&#xff0c;我们在《TortoiseGit 入门指南08&#xff1a;浏览引用以及在引用间切换》一文中知道&#xff0c;标签 是一种 引用&#xff1b;还知道每个提交都对应着一个 SHA-1 值&#xff0c;而引用就是 SHA-1 的一…

常见面试题之HashMap

1. 二叉树 1.1 二叉树概述 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只有左子节点&#xff0c;有的节…

jmeter压测过程中,ServerAgent响应异常:Cannot send data to network connection

ServerAgent异常信息&#xff1a; Cannot send data to network connection&#xff08;无法将数据发送到网络连接&#xff09; 原因&#xff1a; linux 防火墙 拦截了当前端口 解决方案&#xff1a; Linux 执行以下命令 /sbin/iptables -I INPUT -p tcp --dport 4445 -j ACC…

高压功率放大器应用场合是什么

高压功率放大器是一种能够将低电压信号转换为高电压输出信号的设备。它通常由前置放大器和功率放大级组成&#xff0c;广泛应用于雷达、医疗、半导体测试和工业自动化等领域。下面安泰电子将介绍高压功率放大器的几个主要应用场合。 一、雷达系统 雷达系统需要产生高频、高功率…

【IDEA大项目依赖分析卡死-解决方案】Processing build files for dependencies analysis...

最近一直在研究一个大型项目&#xff0c;在IDEA里面启动调试的时候&#xff0c;IDEA经常会进行Processing build files for dependencies analysis…&#xff08;处理构建文件进行依赖分析&#xff09;&#xff0c;并且在这个步骤耗时太久甚至直接卡死。经过一些排查找到了解决…

arping命令 ip地址冲突检测 根据ip查mac地址

arping命令介绍 arping 命令主要用来获取ip对应的mac地址&#xff0c;更新本地arp缓存表。平时主要用来探测ip地址是否冲突即同一个网络里&#xff0c;同一个ip不同mac地址的情况。ip地址冲突将导致网络故障。 arping常用命令参数 arping [参数] ip -U 强制更新邻近主机的a…

Android系统开发-入门篇

参见&#xff1a;[视频教程] 写给应用开发的 Android Framework 教程——玩转 AOSP 篇之 Android 系统开发工具推荐 - 掘金 前置条件&#xff1a; android系统源码位于 linux 服务器&#xff0c;ssh 地址假如为&#xff1a;test172.1.10.2本机为windows 1、本机&#xff1a; 下…

leetcode 101.对称二叉树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;对称二叉树 思路&#xff1a; 这道题和 leetcode 100.相同的树 类似&#xff0c;是上一道的变形题。✨leetcode 100.相同的树 代码链接&#xff1a;【往期文章】leetcode 100.相同的树。这道题把根的左子树和右子树看作两…

ROS:动态参数

目录 一、前言二、概念三、作用四、实际用例4.1需求4.2客户端4.2.1流程4.2.2新建功能包4.2.3添加.cfg文件4.2.4配置 CMakeLists.txt4.2.5编译 4.3服务端(C)4.3.1流程4.3.2vscode配置4.3.3服务器代码实现4.3.4编译配置文件4.3.5执行 4.4服务端(Python)4.4.1流程4.4.2vscode配置4…

Spring核心问题解答

1.谈谈对Spring的理解 Spring是Java EE编程领域的一个轻量级开源框架&#xff0c;该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建&#xff0c;是为了解决企业级编程开发中的复杂性&#xff0c;实现敏捷开发的应用型框架 。 Spring是一个开源容器框架&#x…

Python+Qt窗体或Django网页支付宝收款码-扫码付款实例

程序示例精选 PythonQt窗体或Django网页支付宝收款码-扫码付款实例 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<PythonQt窗体或Django网页支付宝收款码-扫码付款实例>>编写代…