【算法导论】多项式求和

简介: 一般情况下,一元n次多项式可写成: 其中,pi是指数为ei的项的非零系数,且满足 因此,我们可以采用线性表(定义:线性表是由n个数据元素构成的有限序列,比如数组、向量、链表等等)来表示: 其中,每一项的指数i可以用其系数pi的序号表示。

一般情况下,一元n次多项式可写成:


其中,pi是指数为ei的项的非零系数,且满足


因此,我们可以采用线性表(定义:线性表是由n个数据元素构成的有限序列,比如数组、向量、链表等等)来表示:


其中,每一项的指数i可以用其系数pi的序号表示。

       在通常的应用中,多项式的次数比较大,使得线性表的长度很难确定,因此我们可以考虑链表,向量也可以(c++中)。举例说明:假如我们用数组来表示下面的多项式:


       可见,我们需要一个大小为1549的数组来表示,而实际有用的信息只有数组中的4个元素,其他地方都是0,所以造成了空间浪费。并且如果我们事先不知道多项式的最高次项的指数,则我们需要定义一个足够大的数组来存储,这样做显然浪费了很多内存空间。我们可以使用链表来解决上述问题:

       在计算机内,我们用一个结点来存放多项式的一项,为了节约空间,并和书写习惯一致,只需保留非零系数的项。每个结点分系数、指数和指针三个域,如下图所示,其中的指针next指明下一项的位置。


例如,下面多项式分别为A,B:

        

用循环链表可以表示如下:


       两个多项式相加的运算规则很简单,对所有指数相同的项,将其对应系数相加,若和不为零,则构成和多项式中的一项;将所有指数不相同的项复制到和多项式中。具体实现时,我们以上面的多项式A,B为测试样例。可采用另建链表来存储和的多项式的方法,或采用把一个多项式归并入另一个多项式的方法。我们以后种方法为例,即将A+B的和多项式存储到A中。具体程序实现如下(我采用了循环链表):

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

typedef struct pnode//用链表来存储多项式信息
{
	float coef;//多项式系数
	int   exp;//多项式指数
	struct pnode *next;
}polynode;

polynode *Create()
{
	float coef;
	int exp;
	polynode *head,*s,*r;
	head=(polynode*)malloc(sizeof(polynode));
	head->coef=0;
	head->exp=-1;
	r=head;
	printf("请输入各项的系数和指数:\n");
	while(1)
	{
		scanf("%f %d",&coef,&exp);
		if(coef!=0)//输入0 0来结束输入
		{
			s=(polynode*)malloc(sizeof(polynode));
			s->coef=coef;//s用来保存当前节点
			s->exp=exp;
			r->next=s;
			r=s;
		}
		else
			break;
	}

	r->next=head;//构造循环链表
	return head;

}

polynode*PolyAdd(polynode* pa,polynode* pb)//进行多项式相加
{
	polynode *p,*q,*r,*s;
	float x;
	p=pa->next;//分别指向多项式的第一项
	q=pb->next;
	s=pa;//s用于保存当前节点

	while((p!=pa)&&(q!=pb))//没有结束,回到链表头
	{
		if(p->exp<q->exp)//p的指数小于q的指数,将p放入链表中
		{
			s=p;
			p=p->next;
		}
		else if(p->exp>q->exp)//p的指数大于q的指数,将q放入链表中
		{
			r=q->next;
			q->next=p;
			s->next=q;
			s=q;
			q=r;
		}
		else//当两者指数相同时,进行合并
		{
			x=p->coef+q->coef;
			if(x!=0)
			{
				p->coef=x;
				s=p;
			}
			else//若合并结果为0,将该节点移除
			{
				s->next=p->next;
				free(p);
			}
					p=s->next;
		r=q;
		q=q->next;
		free(r);
		}

	}

	if(q!=pb)//如果多项式b的项数少于多项式a的情况
	{
		r=q;
		while(r->next!=pb)
			r=r->next;
		s->next=q;
		r->next=pa;
	}
	return pa;
}

void Output(polynode *head)// 输出多项式信息
{
	polynode *p;
	printf("系数和指数分别为:");
	p=head->next;
	while(p!=head)
	{
		printf("%.1f , %d    ",p->coef,p->exp);
		p=p->next;
	}
	printf("\n");
}

void main()
{
	polynode* ha,*hb;
	printf("\n建立多项式A:");
	ha=Create();
	Output(ha);
	printf("\n建立多项式B:");
	hb=Create();
	Output(hb);

	ha=PolyAdd(ha,hb);
	printf("\n多项式A+B:");
    Output(ha);
}

运行结果如下:



原文:http://blog.csdn.net/tengweitw/article/details/40476935

作者:nineheadedbird




目录
相关文章
|
8月前
迭代法求一元三次方程
迭代法求一元三次方程
94 0
|
5月前
|
算法
【算法】二分算法——x的平方根
【算法】二分算法——x的平方根
|
7月前
|
机器学习/深度学习 算法 Serverless
利用无穷级数逼近计算幂运算与开根号——Python实现
使用泰勒级数逼近法,本文介绍了如何用Python计算特殊幂运算,包括分数次幂和开根号。通过定义辅助函数,如`exp`、`getN_minus_n`、`multi`和`getnum`,实现了计算任意实数次幂的功能。实验结果显示,算法能有效计算不同情况下的幂运算,例如`0.09^2`、`1^2`、`0.25^2`、`0.09^(0.5)`、`1^(0.5)`和`0.25^(0.5)`。虽然精度可能有限,但可通过调整迭代次数平衡精度与计算速度。
|
机器学习/深度学习 算法
专题六数值微积分与方程求解-2
专题六数值微积分与方程求解
113 0
迭代法解决递推问题:数列和,sinx,ex的近似值
迭代法解决递推问题:数列和,sinx,ex的近似值
133 0
分治法求解中位数
分治法求解中位数
81 0
|
算法 Serverless
专题六数值微积分与方程求解-1
专题六数值微积分与方程求解
126 0
|
算法
秒懂算法 | 递推方程求解方法
时间复杂度和空间复杂度表示为递推方程的两种求解方法。
412 1
秒懂算法 | 递推方程求解方法
|
算法 C++
【基础算法】多项式三大运算 & C++实现
多项式三大运算 & C++实现
657 0
【基础算法】多项式三大运算 & C++实现
7-1 一元多项式求导 (10 分)
7-1 一元多项式求导 (10 分)
117 0