数据结构——链表实现两个多项式加减乘除

用链表的方式实现大数相减-Java实现 package com.company; import java.util.Objects; public class Main { public static void main(String[] args) { // write your code here String num1 = "111"; String num2 = "21"; if (!isDigitalNum(num1) || !isDigitalNum(num2)) { Syste. 阅读详情

任务概述:

使用链表实现两个多项式的基本操作。初级要求:实现加法、减法和微分操作。高级要求:实现乘法和除法操作。(除法操作中,当不能除尽时还要求列出余式。)

要点:

    链表中的每个结点形式如下:

                                                          

链表中,各结点按指数升幂或降幂排列,生成的结果多项式仍使用原多项式所占用的存储空间:两个同类项相加或相减时,如果系数不为0,则修改该结点的系数值,而指数值不变,将该结点链入结果多项式中,而另一项则释放空间;如果系数为0,则这两项占用的空间均需释放。不同类项则直接放入结果多项式中。

 

输入数据格式:

使用文件保存初始的多项式数据,文件名为inputfile.txt,文件中应含有表示两个多项式的初始数据。文件中的数据格式为:

(a,n)…(a,n)(0,0)

(a,n)…(a,n)(0,0)

AND/SUB/DIFF/MUL/DIV(#,#)

其中,a是系数,n是指数,两数之间使用逗号分隔,并用括号括起来。其后以(0,0)作为一个多项式输入的结束。以字符串AND表示加法操作,以字符串SUB表示减法操作,以字符串DIFF表示微分操作,以字符串MUL表示乘法操作,以字符串DIV表示除法操作,以(#,#)作为全部数据输入的结束标志。

 

输出数据格式:

输出结果也保存在文件中,文件名为outputfile.txt,文件中应含有结果多项式的值,以多项式的形式输出结果,例如如下所示的多项式:

2x3 –5x2 + x1 +9

在输出文件中表示为:2x3 –5x2 + x1 +9

 

输入数据:

以下面示例中的数据作为输入数据,将所得结果写入输出文件中

测试示例一:

(5,100)(9,31)(-7,2)(1,1)(10,0)(0,0)

(-60,81)(-9,31)(5,2)(1,1)(0,0)

AND(#,#)

测试示例二:

(5,100)(9,31)(-7,2)(1,1)(10,0)(0,0)

(-60,81)(-9,31)(5,2)(1,1)(0,0)

SUB(#,#)

测试示例三:

(5,100)(9,31)(-7,2)(1,1)(10,0)(0,0)

(-60,81)(-9,31)(5,2)(1,1)(0,0)

MUL(#,#)

 

代码如下(vs2012下):

#include<iostream>
#include<fstream>
using namespace std;
class  node
{
public:
	float coef;//系数  
	int exp;//指数  
	node *next;
	//构造函数
	node(float a, int b, node* c = NULL)
	{
		coef = a;
		exp = b;
		next = c;
	}
	node(node* c = NULL)
	{
		next = c;
	}
	//析构函数
	~node() {};
};
//多项式类
class polynomia
{
public:
	node* head;
	node* curr;
	//构造函数
	polynomia()
	{
		head = curr = new node;
		head->coef = NULL;
		head->exp = -1;
		head->next = NULL;
		curr = head;
	}	//插入元素
	void insert(node *a)
	{
		node *h = new node();
		h->coef = a->coef;
		h->exp = a->exp;
		h->next = curr->next;
		curr->next = h;
		curr = h;
	}
	void clear()
	{
		node *ctem;
		while (head->next != NULL)
		{
			ctem = head->next;
			head->next = ctem->next;
			delete ctem;
		}
	}
	//析构函数
	~polynomia() {}
};
//加法实现
void ADD(polynomia &i, polynomia &j)
{
	node* p, *q, *u, *pre;
	p = i.head->next;
	q = j.head->next;
	pre = i.head;
	while ((p != NULL) && (q != NULL))
	{
		if (p->exp > q->exp)
		{
			pre = p;
			p = p->next;
		}
		else if (p->exp == q->exp)
		{
			float x;
			x = p->coef + q->coef;
			if (x != 0)
			{
				p->coef = x;
				pre = p;
			}
			else
			{
				pre->next = p->next;
				free(p);
			}
			p = pre->next;
			u = q;
			q = q->next;
			free(u);
		}
		else if (p->exp <q->exp)
		{
			u = q->next;
			q->next = p;
			pre->next = q;
			pre = q;
			q = u;
		}
	}
	if (q != NULL)
	{
		pre->next = q;
	}
}
//减法实现
void SUB(polynomia &i, polynomia &j)
{
	node *p, *q, *u, *pre;
	p = i.head->next;
	q = j.head->next;
	pre = i.head;
	while ((p != NULL) && (q != NULL))
	{
		if (p->exp > q->exp)
		{
			pre = p;
			p = p->next;
		}
		else if (p->exp == q->exp)
		{
			float x;
			x = p->coef - q->coef;
			if (x != 0)
			{
				p->coef = x;
				pre = p;
			}
			else
			{
				pre->next = p->next;
				free(p);
			}
			p = pre->next;
			u = q;
			q = q->next;
			free(u);
		}
		else if (p->exp < q->exp)
		{
			q->coef = -q->coef;
			u = q->next;
			q->next = p;
			pre->next = q;
			pre = q;
			q = u;
		}
	}
	if (q != NULL)
	{
		pre->next = q;
		pre->next->coef = -(q->coef);
	}
}
//乘法实现
void MUL(polynomia &i, polynomia &j)
{
	polynomia ans;
	node *p, *q, *u;
	p = i.head->next;
	int flag = 0;
	while (p != NULL)
	{
		polynomia tem;
		q = j.head->next;
		while (q != NULL)
		{
			u = new node();
			u->coef = p->coef*q->coef;
			u->exp = p->exp + q->exp;
			tem.insert(u);
			q = q->next;
			delete u;
		}
		if (flag == 0)
		{
			ans = tem;
			flag = 1;
		}
		else
		{
			ADD(ans, tem);
		}
		p = p->next;
	}
	i = ans;
}
//除法实现
void DIV(polynomia &i, polynomia &j, polynomia &k)
{
	node *p, *q, *dtem = new node(), *dtemp = new node();
	polynomia ans;
	p = i.head->next;
	q = j.head->next;
	while (p != NULL&&q != NULL)
	{
		polynomia tem;
		if (p->exp < q->exp)
		{
			k = ans;
			break;
		}
		else
		{
			dtem->coef = p->coef / q->coef;
			dtem->exp = p->exp - q->exp;
			ans.insert(dtem);
		}
		while (q != NULL)
		{
			dtemp->coef = dtem->coef*q->coef;
			dtemp->exp = dtem->exp + q->exp;
			tem.insert(dtemp);
			q = q->next;
		}
		q = j.head->next;
		SUB(i, tem);
		p = i.head->next;
	}
}
int main()
{
	float x;
	int y;
	char *oper = new char(), a, b, c;
	ifstream infile1("inputfile.txt");
	infile1 >> a >> x >> b >> y >> c;
	polynomia dong, wen;
	while (x != 0)
	{
		node *li = new node(x, y);
		dong.insert(li);
		delete li;
		infile1 >> a >> x >> b >> y >> c;
	}
	infile1 >> a >> x >> b >> y >> c;
	while (x != 0)
	{
		node *li = new node(x, y);
		wen.insert(li);
		delete li;
		infile1 >> a >> x >> b >> y >> c;
	}
	infile1 >> oper;
	oper[strlen(oper)] = '\0';
	infile1.close();
	if (!strcmp(oper, "AND(#,#)"))
	{
		ADD(dong, wen);
		ofstream out("outputfile.txt");
		char x = 'x';
		node* tem;
		tem = dong.head;
		while (tem->next != NULL)
		{
			if (tem->next->exp != 0)
			{
				out << tem->next->coef << "x" << tem->next->exp;
			}
			else
			{
				out << tem->next->coef;
			}
			while (tem->next->next != NULL)
			{
				if (tem->next->next->coef > 0)
					out << " +";
				break;
			}
			tem = tem->next;
		};
		out.close();
		return 0;
	}
	if (!strcmp(oper, "SUB(#,#)"))
	{
		SUB(dong, wen);
		ofstream out("outputfile.txt");
		char x = 'x';
		node* tem;
		tem = dong.head;
		while (tem->next != NULL)
		{
			if (tem->next->exp != 0)
			{
				out << tem->next->coef << "x" << tem->next->exp;
			}
			else
			{
				out << tem->next->coef;
			}
			while (tem->next->next != NULL)
			{
				if (tem->next->next->coef > 0)
					out << " +";
				break;
			}
			tem = tem->next;
		};
		out.close();
		return 0;
	}
	if (!strcmp(oper, "MUL(#,#)"))
	{
		MUL(dong, wen);
		ofstream out("outputfile.txt");
		node* tem;
		tem = dong.head;
		while (tem->next != NULL)
		{
			if (tem->next->exp != 0 && tem->next->coef != 0)
			{
				out << tem->next->coef << "x" << tem->next->exp;
			}
			else if (tem->next->coef != 0)
			{
				out << tem->next->coef;
			}
			while (tem->next->next != NULL)
			{
				if (tem->next->next->coef > 0)
					out << " +";
				break;
			}
			tem = tem->next;
		}
		out.close();
		return 0;
	}

	if (!strcmp(oper, "DIV(#,#)"))
	{
		polynomia cur;
		DIV(dong, wen, cur);
		ofstream out("outputfile.txt");
		out << "结果是:";
		node* tem;
		tem = cur.head;
		while (tem->next != NULL)
		{
			if (tem->next->exp != 0 && tem->next->coef != 0)
			{
				out << tem->next->coef << "x" << tem->next->exp;
			}
			else if (tem->next->coef != 0)
			{
				out << tem->next->coef;
			}
			while (tem->next->next != NULL)
			{
				if (tem->next->next->coef > 0)
					out << " +";
				break;
			}
			tem = tem->next;
		}
		out << endl << "余项是:";
		tem = dong.head;
		while (tem->next != NULL)
		{
			if (tem->next->exp != 0 && tem->next->coef != 0)
			{
				out << tem->next->coef << "x" << tem->next->exp;
			}
			else if (tem->next->coef != 0)
			{
				out << tem->next->coef;
			}
			while (tem->next->next != NULL)
			{
				if (tem->next->next->coef > 0)
					out << " +";
				break;
			}
			tem = tem->next;
		}
		out.close();

		return 0;
	}
	ofstream out("outputfile.txt");
	out << "输入有误";
	out.close();
	return 0;
	system("pause");
}

 

【数据结构实验】用链表实现两个大整数的相加减 一、实验内容 【问题描述】 设计一个实现任意长的整数进行加法运算的演示程序 。 【基本要求】 利用双向链表实现长整数的存储,每个结点含一个整形变量。输入和输出形式:按中国对于长整数的表示习惯,每四位一组,组间用逗号隔开。 【测试数据】 (1)0 0;应输出“0”。 (2)-2345,6789 -7654,3211;应输出“-1,0000,0000”。 (3)-9999,9999 1,0000,00... 阅读详情

相关推荐

数据结构实验一 用链表实现大整数加减法

题目: 用链表实现大整数加减法操作: 32位机器直接操作的数据最大为32个bit,若超过32bit,则需要单独设计算法。在这里,可以用链表每个结点存储大整数的每一位的十进制数字,则可以进行大整数的算数运算,该实验仅实现加减法操作。 要求: 随机产生2个1~50位的数字串,并存储到2个链表中。 进行加法或减法操作,结果存储到新的链表中。 打印运算结果。 目录 BigInteger.h BigInteger.cpp function.h function.cpp main.cpp ..

m0_61506053的博客 4379

在C语言中用链表实现两个多项式加减乘

目标:输入两个多项式,计算它们的+、-、*的运算结果,并按幂次从小到大输出到屏幕输入方法:从文件输入多项式原始数据           多项式文件的格式如下 n  a1  m1  a2  m2  a3  m3  . .. ai  mi....  an  mn           其中 n 为项数,ai为系数,mi为指数, 它们都是整数。 上述数据所表达的多项式为:           a1*x^m...

xxl10000 2034

用C++链表手搓一个多项式计算器:从输入解析到加减乘除求导的完整实现

本文详细介绍了如何使用C++链表实现一个功能完善的多项式计算器,涵盖输入解析、加减乘除运算及求导等核心功能。通过链表结构高效处理一元多项式的稀疏性,结合工程实践中的输入验证、错误处理和输出格式化技巧,为开发者提供从理论到实践的完整指南。

weixin_29313547的博客 255

使用链表实现两个多项式相加和相乘

设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。 输入样例: 4 3 4 -5 2

qq_15161183的博客 1万+

c语言单链表实现多项式加减乘除(面向小白)

c语言单链表实现多项式加减乘除(面向小白) 大二菜狗开始学数据结构了,老师留了个数据结构小实验,要求实现多项式加减乘除,奈何本人太菜写的全是bug,于是开始上网借鉴前辈的经验。本文代码主要参考多项式除法的实现(附c代码)。 不过前辈写的代码没有注释,并且有一些小bug。于是乎我改了部分函数。现修正后贴出来。并且增加了菜狗能看懂的注释。(所以就厚脸皮投原创了) 注意:由于笔者水平捉急,代码依旧存在bug。例如什么堆破坏等,不过我也没弄明白要咋搞,遇到这种情况有一个很low的办法,就是多运行几次就好了。恳请如果

qq_45881703的博客 2754

java实现多项式的加减乘除

package polynomial; public class Polynomial { Polynomial next; double data; // 系数值 int power; // 幂值 public Polynomial(){ this(0.0, -1); } public Polynomial(double data, int power){ ...

五彩世界的博客 4005

【C语言X数据结构】用静态链表实现的多项式计算器,加减乘除求导求值,输入输出样样在行!(完整代码+注释)

目录 实验要求 完整代码 逻辑设计 哈喽各位好,我是李博轩,一个刚转到计算机的大二学生。这个标题是随手打上去的,感觉还蛮顺口,就这样了。 这个学期在学【数据结构与算法】,而这是我面对的第一个实验题。因为大一不在计算机,编程能力落后于人,这个作业也花了很多时间和精力。总之,下面把题目要求和代码附上,希望得到各位的指点。 实验要求 以动态或者静态链表存储一元多项式,在此基础上按要求完成对一元多项式的运算。(为保证多项式的值的准确性,多项式的系数可以用分数表示,涉及到两个分数相除...

Li_Boxuan的博客 1193

一元多项式的表示及加减乘除运算

例如:如何实现用线性链表表示多项式的加法运算? 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。 #include #include #include typedef struct polyn { floa

韦婵娟 9271

数据结构__两个多项式乘法运算

这个,也是第一次数据结构课程设计的题目 一共四个文件,分别命名为main.cpp head.h list.h cal.h。作用分别是main函数主程序,基本头文件卷入,单链表和其基本操作的定义,计算并合并同类项目操作 注释就不写了,因为没啥好写的,我也不知道该写些什么。 main.cpp #include"cal.h" int main(void) { cal(); ...

My Struggle 4975

一元多项式的加减乘除运算(c++实现)—数据结构学习

#include<iostream> #include<stdio.h> #include<stdlib.h> using namespace std; typedef struct Node* List; struct Node { List next;//指向下一个结点 int x;//指数 int z;//系数 }; List Read() { ...

qq_29131907的博客 2779

C语言多项式运算实现指南:加减乘除

多项式是数学中的基础概念,由变量(通常是未知数x)和系数通过有限次加、减、乘、常数次幂运算组合而成的代数表达式。在计算机科学中,多项式用于算法设计、编码理论等多个领域。它不仅仅是数学领域的研究对象,其在计算机程序中的表示和操作也至关重要。首先定义一个结构体来表示多项式,通常需要记录每个系数以及对应的指数。一个简单的多项式结构体可能如下所示:int *coeff;// 系数数组int *exp;// 指数数组int length;

weixin_42402664的博客 572

用C++实现一元多项式的四则运算包括数据的文件导入与导出

对于一元多项式我们都再熟悉不过了,这是使用数据结构的单链表进行实现的,下面贴一下我的实现代码,欢迎批评指导 //test.h #pragma once #include #include using namespace std; class P_Sum { public: typedef struct P_node { double coef; int index; P_node* n

weeks 3431

Xilinx FPGA 10G Ethernet Subsystem example

The 10G Ethernet subsystem provides 10 Gb/s Ethernet MAC, Physical Coding Sublayer(PCS) and Physical Medium Attachment (PMA) transmit and receive functionality over anAXI4-Stream interface.

青城扬沙的博客 2382

数据结构线性表之约瑟夫环&&多项式求和&&差&&积&&导数&&给变量赋值小练习

问题描述 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后 [1] 结果+1即为原问题的解。 数学上的一元多项式的表示是p(x) = p0 + p1 *...

changke的博客 419

Gromacs实战:从蛋白质-小分子对接到分子动力学模拟全流程解析

本文详细解析了使用Gromacs进行蛋白质-小分子复合物分子动力学模拟的全流程。从处理AutoDock等对接软件的结果文件开始,逐步指导如何为蛋白质和小分子分别生成拓扑文件,并解决力场合并的核心挑战。文章涵盖了构建模拟盒子、添加溶剂离子、能量最小化、平衡模拟以及关键的轨迹分析步骤,为计算生物学和药物设计研究者提供了一套从静态对接到动态评估的完整实战指南。

weixin_29251337的博客 1220

MimicKit 人形机器人强化学习全身模仿控制算法使用教程

本文介绍了MimicKit运动模仿算法框架的使用指南。主要内容包括:1)安装IsaacGym和依赖项;2)训练模型命令及参数说明;3)测试模型的方法;4)分布式训练配置;5)使用TensorBoard可视化日志;6)动作数据格式说明。该框架支持DeepMimic、AMP、ASE、ADD等算法,包含PPO、AWR等强化学习算法,适用于物理仿真角色动画控制研究。

机器人控制与仿真应用 1203

2.9.5线性表案例代码

一元多项式是指只涉及一个未知数的多项式,例如:3x^2 + 2x + 1。在计算机科学中,一元多项式常用于图形学、计算机视觉等领域。

m0_68002095的博客 151

QCC51XX---人机接口设备协议( HID)

QCC51XX---人机接口设备协议( HID)

weixin_42162924的博客 820

Arbitrary-Precision Integer Arithmetic Package with Linked List 链表实现任意精度整数运算包

链表实现任意精度整数运算包,统计 2^4000 的各字符数量,C 语言实现方法。题目来自《数据结构与算法分析:C 语言描述》第三章课后第 9 题。

qq_39443083的博客 322

OSG 核心详解

OpenSceneGraph (OSG) 的核心架构、场景图管理以及几何体的绘制

qq_45859163的博客 730

解决此平台不支持虚拟化的 Intel VT-x/EPT故障问题

当我们在VMware Workstation虚拟机上【启用】虚拟系统(如:Windows10)所在的虚【拟机设置】【处理器】【虚拟化引擎】下面的【虚拟化 Intel VT-x/EPT 或AMD-V/RVI(V)】内容后,在启动虚拟系统时,虚拟系统无法启动,且弹出【此平台不支持虚拟化的 Intel VT-x/EPT。不使用虚拟化的 Intel VT-x/EPT,是否继续】窗口

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

利用链表实现一元多项式加法减法|数据结构

一元多项式运算——链表实现1、说明:2、代码实现 1、说明: 链表的应用之一:一元多项式运算,这里先说明一元多项式加法,减法类同 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201118203932761.PNG?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0xMTExRWg==,size_16,color

LLLLQZ的博客 5465

十一、增强现实

那都是n年前的老版本了,新版本完全没有这个问题,我就是纠结这个问题,搭建若干环境,又是vmware虚拟机,又是msys2,又是anaconda,又是找机器,折腾了几天,结果通通不是。以一张实际卡片为锚点,通过笔记本的摄像头,在显示器上将一个计算机内的3d物体显示在卡片上,类似于电影上看到的那种全息投影技术;如果你是想在windows环境下开发linux运行程序,那么CygWin/gcc是你的不二之选。而如果你想开发的是windows运行程序,并且追求速度,那么二者相比而言,MinGW是更好的选择。

3189

11 2.2案例引入(青岛大学-王卓)笔记

创建一个新的数组存放两个多项式的系数与指数,当计算A+B时,分别从头遍历比较A与B的每一项,对于相同指数的数,其系数相加。对于指数不同的数,先放系数小的进去。B(x)=8x+22x^7-9x^8 其线性表:B=((8,1),(22,7),(-9,8))如:A(x)=7+3x+9x^8+5x^17 其线性表:A=((7,0),(3,1),(9,8),(5,17))对于稀疏多项式:线性表p=((p1,e1),(p2,e2)....(pm,em))

weixin_61656260的博客 99

Autosar PNC网络管理配置-UserData的使用

之前配置的网络管理报文中的data都由ComM管理,后面客户新增了需求,最后两个byte需要发送,本文记录一下相关配置的修改能配置生成的,尽量不手码,毕竟手写一堆bug~

赞的博客 1907

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言数据结构:一元多项式运算器

一元多项式运算器的分析与实现 首先,需要解决一元多项式在计算机中的存储问题。 对于一元多项式: P = p0 + p1x + …+pnx^n 在计算机中,可以用一个线性表来表示: P = (p0,p1,…,pn), 但是对于形如 S(x) = 1 + 5x^10 000 -12x^15 000 的多项式,上面的方法显然不合适,会有很多的项系数为0,造成存储空间的浪费,因此只需要存...

weixin_44270855的博客 4650

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: NLP成长计划(三)
下一篇: 数据结构——Huffman编码及译码
codes_first
博客等级 码龄10年 255粉丝 34原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值