(C语言)一元多项式的乘法与加法运算

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

输入格式:

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

输出格式:

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

输入样例:

4 3 4 -5 2  6 1  -2 0
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

代码: 

# include <stdio.h>
# include <stdlib.h>

struct Node {
	int coef;
	int expn;
	struct Node * next;
};

struct Node * createList(int n)
{
	struct Node * L = (struct Node *)malloc(sizeof(struct Node));
	struct Node * p = L;
	L->next = NULL;
	while (n--)
	{
		int coef, expn;
		scanf("%d%d", &coef, &expn);
		p->next = (struct Node *)malloc(sizeof(struct Node));
		p = p->next;
		p->coef = coef;
		p->expn = expn;
		p->next = NULL;
	}
	return L;
}

void print(struct Node * L)
{
	for (struct Node * p = L; p->next != NULL; p = p->next)
		printf("%d %d%s", p->next->coef, p->next->expn, p->next->next == NULL ? "\n" : " ");
	return;
}

// 把A加到B中
void addAtoB(struct Node * A, struct Node * B)
{
	struct Node *preb = B;
	while (A->next != NULL && preb->next != NULL)
	{
		if (A->next->expn > preb->next->expn)
		{
			// preb后面插入A->next节点
			struct Node * tmp = A->next;
			A->next = tmp->next;
			tmp->next = preb->next;
			preb->next = tmp;
		}
		else if (A->next->expn < preb->next->expn)
		{
			preb = preb->next;
		}
		else
		{
			if (A->next->coef + preb->next->coef == 0)
			{
				struct Node * tmp = A->next;
				A->next = tmp->next;
				free(tmp);
				tmp = preb->next;
				preb->next = tmp->next;
				free(tmp);
			}
			else
			{
				preb->next->coef += A->next->coef;
				struct Node * tmp = A->next;
				A->next = tmp->next;
				free(tmp);
			}
		}
	}
	if (A->next != NULL)
	{
		preb->next = A->next;
		A->next = NULL;
	}
	if (B->next == NULL)
	{
		B->next = (struct Node *)malloc(sizeof(struct Node));
		B->next->next = NULL;
		B->next->coef = B->next->expn = 0;
	}
	return;
}

struct Node * multi(struct Node * A, struct Node * B)
{
	struct Node * L = (struct Node *)malloc(sizeof(struct Node));
	L->next = NULL;
	
	for (struct Node * pa = A->next; pa != NULL; pa = pa->next)
	{
		struct Node * prel = L;
		for (struct Node * pb = B->next; pb != NULL; pb = pb->next)
		{
			int newCoef = pa->coef * pb->coef;
			int newExpn = pa->expn + pb->expn;
			if (newCoef == 0) continue;
			struct Node * prel = L;
			if (prel->next == NULL)
			{
				int b = 1;
			}
			for (;prel->next != NULL && prel->next->expn > newExpn ; prel = prel->next)
			{
				int a = 1;
			}

			if (prel->next == NULL || prel->next->expn < newExpn)
			{
				struct Node * tmp = (struct Node *)malloc(sizeof(struct Node));
				tmp->coef = newCoef;
				tmp->expn = newExpn;
				tmp->next = prel->next;
				prel->next = tmp;
			}
			else
			{
				prel->next->coef += newCoef;
				if (prel->next->coef == 0)
				{
					struct Node * tmp = prel->next;
					prel->next = tmp->next;
					free(tmp);
				}
			}

		}
	}

	if (L->next == NULL)
	{
		L->next = (struct Node *)malloc(sizeof(struct Node));
		L->next->next = NULL;
		L->next->coef = L->next->expn = 0;
	}

	return L;
}


int main(void)
{
	int la, lb;
	scanf("%d", &la);
	struct Node * A = createList(la);
	scanf("%d", &lb);
	struct Node * B = createList(lb);

	// 乘法
	struct Node * D = multi(A, B);
	print(D);

	// 加法
	addAtoB(A, B);
	print(B);
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4. 【自动驾驶与机器人中的SLAM技术】点云中的拟合问题和K近邻

目录 1.在三维体素中定义 NEARBY14&#xff0c;实现 14 格最近邻的查找。2.推导arg max||Ad||22的解为ATA的最大特征向量或者奇异向量。3. 将本节的最近邻算法与一些常见的近似最近邻算法进行对比&#xff0c;比如nanoflann&#xff0c;给出精度指标和时间效率指标。4. 也欢迎大…

【C++】【Opencv】cv::GaussianBlur、cv::filter2D()函数详解和示例

本文通过函数详解和运行示例对cv::GaussianBlur和cv::filter2D()两个函数进行解读&#xff0c;最后综合了两个函数的关系和区别&#xff0c;以帮助大家理解和使用。 目录 cv::GaussianBlur&#xff08;&#xff09;函数详解运行示例 filter2D()函数详解运行示例 总结两个函数联…

python实现梯度距离平方反比法GIDS

1 梯度距离平方反比法 梯度距离平方反比法(gradient plus inverse distance squared (GIDS))由Nalder和Wein于1988年提出&#xff0c;是一种考虑了气象要素随经纬度和海拔高度变化的反距离权重法&#xff0c;其空间插值计算公式如下&#xff1a; 式中&#xff1a; z z z 表示代…

自动化测试,你一定要知道的知识

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Mybatis的Mapper接口传递多个参数的时候必须要加@Param注解吗?

答案是&#xff1a;不一定&#xff0c;取决于mybatis的版本、jdk的版本和javac的编译选项。 测试代码 Maven依赖&#xff1a; <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId>…

手把手教你搭建属于自己的快递小程序

在数字化时代&#xff0c;小程序已经成为各行各业连接用户、提供服务、创造价值的重要工具。其中&#xff0c;快递寄件小程序因其实用性和广泛的需求&#xff0c;成为很多企业和开发者关注的焦点。本文将详细介绍如何快速创建快递寄件小程序&#xff0c;以及如何利用它实现盈利…

UI设计是什么意思?一文给你讲清楚

随着互联网的快速发展&#xff0c;用户界面UI设计在中国也逐渐发展&#xff0c;用户界面UI设计的目的不仅是让用户&#xff0c;有视觉享受&#xff0c;而且解决用户如何与互联网设备交互&#xff0c;因此&#xff0c;用户界面UI设计是通过用户使用习惯、操作逻辑、界面交互和视…

非常经典的一道SQL报错注入题目[极客大挑战 2019]HardSQL 1(两种解法!)

题目环境&#xff1a; 没错&#xff0c;又是我&#xff0c;这群该死的黑客竟然如此厉害&#xff0c;所以我回去爆肝SQL注入&#xff0c;这次&#xff0c;再也没有人能拿到我的flag了 做了好多这个作者出的题了&#xff0c;看来又要上强度了 判断注入类型 username&#xff1a;a…

【下载器】NDM和IDM介绍(含安装包和教程)

1 IDM&#xff08;增强型下载管理器&#xff09; 1.1 IDM介绍 官网&#xff1a;Internet Download Manager (IDM) 优缺点&#xff1a; 高速下载&#xff1a; IDM通过多线程下载和分段下载技术&#xff0c;能够显著提高下载速度&#xff0c;从而节省用户的时间。暂停和恢复功…

线程的面试八股

Callable接口 Callable是一个interface,相当于给线程封装了一个返回值,方便程序猿借助多线程的方式计算结果. 代码示例: 使用 Callable 版本,创建线程计算 1 2 3 ... 1000, 1. 创建一个匿名内部类, 实现 Callable 接口. Callable 带有泛型参数. 泛型参数表示返回值的类型…

2023年第九届数维杯国际大学生数学建模挑战赛

2023年第九届数维杯国际大学生数学建模挑战赛正在火热进行&#xff0c;小云学长又在第一时间给大家带来最全最完整的思路代码解析&#xff01;&#xff01;&#xff01; D题解题思路如下&#xff1a; 完整版解题过程及代码&#xff0c;稍后继续给大家分享~ 更多题目完整解析点…

002 OpenCV dft 傅里叶变换

目录 一、傅里叶变换 1.1 傅里叶变换概念 1.2 opencv中傅里叶变换 二、实验代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、傅里叶变换 2.1 傅里叶变换概念 傅里叶变换&#xff08;Fourier Transform&#xff09;是一种…

CSAPP第四章:Y86 SEQ(指令顺序执行)的硬件结构

SEQ硬件结构的抽象表示。 程序计数器放在寄存器中(左下角&#xff0c;起点)。先向上&#xff0c;再向右 取指&#xff1a;将程序计数器寄存器作为地址&#xff0c;指令存储器读取一个指令的字节&#xff0c;PC增加器计算valP(程序计数器增加后的值)。 解码&#xff1a;寄存器…

openGauss学习笔记-125 openGauss 数据库管理-设置账本数据库-校验账本数据一致性

文章目录 openGauss学习笔记-125 openGauss 数据库管理-设置账本数据库-校验账本数据一致性125.1 前提条件125.2 背景信息125.3 操作步骤 openGauss学习笔记-125 openGauss 数据库管理-设置账本数据库-校验账本数据一致性 125.1 前提条件 数据库正常运行&#xff0c;并且对防…

创建一个用户test且使用testtab表空间及testtemp临时表空间并授予其权限,密码随意

文章目录 1、连接到数据库2、创建表空间创建testtab表空间创建testtemp临时表空间 3、创建用户4、授予权限5、测试 1、连接到数据库 sqlplus / as sysdba2、创建表空间 创建testtab表空间 CREATE TABLESPACE testtab DATAFILE /u01/app/oracle/oradata/orcl/testtab.dbf S…

【Spring】bean的基础配置

bean的别名 当在Spring config文件中定义name作为别名后&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instan…

关于 Git 你了解多少?

1. 什么是Git? Git 是一个版本控制系统&#xff0c;由林纳斯托瓦兹创建。它旨在管理项目代码的更改&#xff0c;以便团队成员可以协作开发和维护代码库。Git 可以让用户跟踪代码的更改、回滚错误的更改、合并代码等。Git 还具有分支和标签的功能&#xff0c;使得团队成员可以在…

个人简历管理系统winform

说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#winform架构和sql server数据库 功能模块&#xff1a; 个人简历管理系统 简历信息添加 修改 删除 查询简历 运行环境&#xff1a; 运行需vs2013或者以上版本&#xff0…

Mistral 7B 比Llama 2更好的开源大模型 (三)

Mistral 7B 比Llama 2更好的开源大模型 Mistral 7B是一个70亿参数的语言模型,旨在获得卓越的性能和效率。Mistral 7B在所有评估的基准测试中都优于最好的开放13B模型(Llama 2),在推理、数学和代码生成方面也优于最好的发布34B模型(Llama 1)。Mistral 7B模型利用分组查询注…

Linux(1):开始

计算机组成概述 计算机&#xff1a;接受用户输入指令与数据&#xff0c;经由中央处理器的数学与逻辑单元处理后&#xff0c;以产生或存储有用的信息。 主要可以分为3个部分&#xff1a;输入单元、主机单元、输出单元。 中央处理器&#xff08;Central Processing Unit, CPU&a…