C++__一元多项式相加

  1. 问题描述

一元多项式每一项由系数Pi及x的指数i组成。若多项式按照升幂排列,则它由n+1个系数唯一确定,因此可以用一个线性表表示,其指数i隐藏在系数Pi的序号内。分别两个多项式A(x)、B(x)系数、指数所构成的表。输出为两多项式和C(x)所构成的链表。

  1. 设计思路

将B(x)加到A(x)后,形成C(x)。带有头结点的线性链表表示多项式A(x)、B(x),ha、hb分别指向A(x)、B(x)的头指针,p、q分别指向多项式第一项。比较p、q结点的指数项若p结点指数项小q结点指数项,则p所指结点为C(x)一项,p后移一个结点;若p指数项大于q指数项,则q所指结点为C(x)一项。若相等,则系数相加,为零则删去,否则修改系数并回收。所用变量包括线性链表头指针ha、hb,指针p、q。算码描述:

           ADD(ha,hb)

  1. p<-next(ha);q<-next(hb)
  2. pre<-ha;hc<_ha   //pre指向p的前驱,hc为C(x)头指针
  3. while(p!=nil)AND (q!=nil) do
  4. case
  5. EXP(p)<EXP(q):
  6. {pre<-p; p<-next(p)}
  7. EXP(p)=EXP(q):
  8. {X<-COFE(p)+COFE(q);
  9. If(x!=0) then {COFE(p)<-x;pre<-q}
  10. Else {next (pre)<-next(p);RET(p)}
  11. P<-next(pre);u<-q;q<-next(q);RET(u)}
  12. EXP(p)>EXP(q):
  13. {u<-next(q); next(q)<-p;next(pre)<-q;pre<-q;q<-u}
  14. End(case)
  15. End(while)
  16. If(q!=nil) then next (pre)<-q
  17. RET(hb)         //释放多项式B(x)头结点//
  18. Return
  1. 测试用例及结果说明

测试用例:A(x)=3x+5x^12+6x^64; B(x)=4x+4x^10+7x^128

测试结果:C(x)=7x+4x^10+5x^12+6x^64+7x^128

  1. 设计及测试过程

第一步:提出问题;

第二步:问题转换;

第三步:算法构思;

第四步:伪码描述;

第五步:代码编写;

第六步:代码测试;

第七步:代码修正;

参考书籍:《计算机软件技术基础》 清华大学出版社 第三版

  1. 评价和改进

算法优点:链式存储形式节约了大量空间。

算法缺点:算法实质是将B(x)加到A(x)之后,运算结束后丢失了初始数据。

  1. 心得体会

软件技术的学习需要实践的积累,在实际的编写之中可以领悟到软件工程师的思维模式和工作过程,有利于工程思想的培养。

 

#include<iostream>
using namespace std;
struct node
{
	int exp;
	float coef;
	struct node *next;
}*ha,*hb;
void print(struct node *head)
{
	struct node *p;
	p=head->next;
	while(p->next!=NULL)
	{
		cout<<p->coef<<"X"<<p->exp<<"+";
		p=p->next;
	}
	cout<<p->coef<<"X"<<p->exp;
}
int main()
{
	int exp;
	float coef;
	struct node *tail,*newnode;
	cout<<"请输入第一个多项式的系数和次数(结束输入请输入‘0’)"<<endl;
	ha=new node;
	tail=ha;
	while(1)
	{
		cin>>coef;
		if(coef==0)
			break;
		cout<<"X";
		cin>>exp;
		cout<<"+";
		newnode=new node;
		newnode->coef=coef;
		newnode->exp=exp;
		tail->next=newnode;
		tail=newnode;
	}
	tail->next=NULL;
	cout<<"请输入第二个多项式的系数和次数(结束输入请输入‘0’)"<<endl;
	hb=new node;
	tail=hb;
	while(1)
	{
		cin>>coef;
		if(coef==0)
			break;
		cout<<"X";
		cin>>exp;
		cout<<"+";
		newnode=new node;
		newnode->coef=coef;
		newnode->exp=exp;
		tail->next=newnode;
		tail=newnode;
	}
	tail->next=NULL;
	print(ha);
	cout<<"+";
	print(hb);
	cout<<"=";
	float x;
	struct node *p=ha->next;
	struct node *q=hb->next;
	struct node *pre=ha;
	struct node *hc=ha;
	struct node *u;
	while(p!=NULL&&q!=NULL)
	{
		if(p->exp<q->exp)
		{
			pre=p;
			p=p->next;
		}
		else if(p->exp==q->exp)
		{
			x=p->coef+q->coef;
			if(x!=0)
			{
				p->coef=x;
				pre=p;
			}
			else
				pre->next=p->next;
			p=pre->next;
			u=q;
			q=q->next;
		}
		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;
	print(ha);
	cout<<endl;
	system("pause");
	return 0;
}

 

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一元多项式相加是在数据结构中比较基础的一部分,也是我们在数学中常见的操作。在计算机中,我们通常将多项式看作一个数组(或链表)的形式,其中数组下标表示该项的指数,数组中存放的值表示该项的系数。两个多项式相加就是将两个数组对应项的系数相加得到一个新的数组。 具体步骤如下: 1. 定义一个数组(或链表)来存放结果多项式,长度为两个原始多项式中指数最大的项数加1。 2. 遍历两个原始多项式数组(或链表),将对应项的系数相加,赋值给结果数组的对应项。 3. 返回结果数组(或链表)。 当然,在实现过程中还需注意以下几点: 1. 若某个多项式存在系数为0的项,则计算时应该忽略该项,即不将其对应项相加到结果数组中。 2. 当两个原始多项式不等长时,需在系数较短的数组中补0,使其长度与较长数组相等。 3. 若相加的结果系数为0,则结果多项式也应该忽略该项,即不将其加入到结果数组中。 总之,一元多项式的加法并不复杂,只需遍历数组,将对应项的系数相加即可。需要注意的是,在实现过程中考虑越界以及忽略系数为0的项这些问题。 ### 回答2: 一元多项式的运算主要包括加、减、乘和求导等,其中加法是最基本的一种运算。在数据结构中,我们可以用链表来表示一元多项式,在链表中每个结点表示一个单项式,包含系数和指数两个数据项。对于两个一元多项式的相加,则需要对它们的各个单项式进行合并,合并的方法是按照单项式的指数大小进行排序,然后分别将同一指数的单项式的系数相加得到新的单项式,最终得到一个新的一元多项式。 具体实现上,可以通过定义一个新的链表来存储结果,然后使用两个指针分别遍历两个原始的链表,根据两个指针所对应的单项式的指数关系来决定需要将哪个单项式加入到结果链表中。需要注意的是,在遍历的过程中,如果出现同一指数的单项式,则需要将它们的系数相加得到新的单项式,否则直接将单项式插入结果链表中即可。 在实现过程中,可以使用一个小技巧来简化代码,即使用一个哑结点作为结果链表的头结点,这样就可以省略对链表进行空判断的代码。同时,为了提高运算效率,可以对原始链表进行排序,使得它们的单项式按照指数大小排列,从而便于遍历和合并。 综上所述,一元多项式的相加需要按照单项式的指数大小进行排序,然后遍历两个原始链表,合并同一指数的单项式并插入结果链表中,最终得到一个新的一元多项式。具体实现需要考虑空链表和排序等细节问题。 ### 回答3: 一元多项式相加是数据结构中的一个重要问题。我们需要定义一个多项式的结构体,同时考虑到指数可能不是连续的整数,我们需要使用链表来保存每一项的系数和指数。具体来说,结构体的定义如下: ```c typedef struct node { int coefficient; // 系数 int exponent; // 指数 struct node* next; // 下一项 } polynomial; ``` 接下来,我们可以先将两个多项式按指数从小到大排序,然后使用“归并”算法将它们相加。具体来说,分别遍历两个多项式的链表,按指数大小比较,将系数较小的项插入结果链表,并且修改指针。最后,如果有多余项,直接将它们接在结果链表的末尾即可。 具体实现如下: ```c polynomial* add(polynomial* p1, polynomial* p2) { polynomial* result = (polynomial*)malloc(sizeof(polynomial)); polynomial* cur = result; while (p1 && p2) { if (p1->exponent < p2->exponent) { cur->next = p1; p1 = p1->next; } else if (p1->exponent > p2->exponent) { cur->next = p2; p2 = p2->next; } else { cur->next = p1; cur->next->coefficient += p2->coefficient; p1 = p1->next; p2 = p2->next; } cur = cur->next; } cur->next = p1 ? p1 : p2; return result->next; } ``` 最后,记得要释放内存。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值