南邮 OJ 1005 多项式加法



多项式加法

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 2454            测试通过 : 307 

比赛描述

线性表是一种最简单、最基本,也是最常用的数据结构,其用途十分广泛,例如,用带表头结点的单链表求解一元整系数多项式加法和乘法运算。

现给两个一元整系数多项式,请求解两者之和。



输入

两组数据,每一组代表一个一元整系数多项式,有多行组成,其中每一行给出多项式每一项的系数和指数,这些行按指数递减次序排序,每一组结束行为

0 -1

输出

三组数据,前两组为一元整系数多项式,最后一组为两个多项式的和。

一元整系数多项式输出形式如下:

1)多项式项4x输出为4X

2)多项式项4x2输出为4X^2

3)第一项系数为正数时,加号不要输出

4)除常系数项外,项系数为1不显式输出,-1输出为-

例如,4x3- x2+x-1正确输出形式为4X^3-X^2+X-1,错误输出形式为 +4X^3-1X^2+1X-1

样例输入

3 14
-8 8
6 2
2 0
0 -1
2 10
4 8
-6 2
0 -1

样例输出

3X^14-8X^8+6X^2+2
2X^10+4X^8-6X^2
3X^14+2X^10-4X^8+2

提示

该题属于南京邮电大学《数据结构A》实验一中的内容,验证的是课本代码,请慎重解答。

题目来源

CHENZ


#include<iostream>
using namespace std;

typedef struct node{
	int coefficient;			//多项式系数
	int exponent;				//多项式指数
	struct node *next;
}polynomialNode;

void printPolynomial(polynomialNode *head){	//打印多项式
	polynomialNode *p = head->next;
	if(p == NULL)
		cout<<"0";
	while(p!=NULL){
		if(p->coefficient > 0){				//正数
			if(p != head->next)				//除了第一项之外正数输出“+”
				cout<<"+";
			if(p->coefficient != 1)			//系数为1不输出
				cout<<p->coefficient;
		}
		else{								//负数
			if(p->coefficient == -1)						//-1的话只输出“-”
				cout<<"-";
			else							//否者输出整个系数,如-2
				cout<<p->coefficient;	
		}
		if(p->exponent == 0){				//指数为0,常数项,不输出X^0				
			if(p->coefficient == 1 || p->coefficient == -1)
				cout<<1;

		}
		else if(p->exponent == 1)			//指数项为1
			cout<<"X";
		else								//指数项即不为0也不为1
			cout<<"X^"<<p->exponent;
		p = p->next;
	}
	cout<<endl;
}

void inputPolynomial(polynomialNode *inputHead){
	int tempCoefficient;
	int tempExponent;
	polynomialNode *p,*q;
	while(cin>>tempCoefficient>>tempExponent &&\
		(tempCoefficient!=0 || tempExponent!=-1)){
		if(tempCoefficient == 0)								//系数为0,不增加节点
			continue;	
		p = inputHead;
		while(p->next!=NULL && p->next->exponent>tempExponent)	//幸好有短路求值,否者访问出错
			p = p->next;
		if(p->next == NULL || p->next->exponent<tempExponent){	//到达队列尾部或者有新的指数项,幸好有短路求值,否者访问出错
			polynomialNode *tempNode = new polynomialNode();
			tempNode->coefficient = tempCoefficient;
			tempNode->exponent = tempExponent;
			tempNode->next = p->next;
			p->next = tempNode;
		}
		else{													//指数项已经出现过,只要将系数相加
			q = p->next;
			q->coefficient += tempCoefficient;
			if(q->coefficient == 0){
				p->next = q->next;								//系数等于0则删除节点
				delete q;
			}
		}
	}
}

void addPolynomial(polynomialNode *add1,polynomialNode *add2,polynomialNode *sum){
	polynomialNode *p,*q,*r,*s;

	p = add1->next;
	q = add2->next;
	r = sum;
	while(p!=NULL || q!=NULL){
		s = NULL;
		if(q==NULL){
			s = new polynomialNode();
			s->coefficient = p->coefficient;
			s->exponent = p->exponent;
			p = p->next;
		}
		else if(p==NULL){
			s = new polynomialNode();
			s->coefficient = q->coefficient;
			s->exponent = q->exponent;
			q = q->next;		
		}
		else if(p->exponent > q->exponent){
			s = new polynomialNode();
			s->coefficient = p->coefficient;
			s->exponent = p->exponent;
			p = p->next;		
		}
		else if(p->exponent < q->exponent){
			s = new polynomialNode();
			s->coefficient = q->coefficient;
			s->exponent = q->exponent;
			q = q->next;		
		}
		else{										//pq指数项相等
			if(p->coefficient+q->coefficient != 0){	//系数和不为0才新建项
				s = new polynomialNode();
				s->coefficient = p->coefficient+q->coefficient;
				s->exponent = p->exponent;
			}
			p = p->next;
			q = q->next;
		}
		if(s!=NULL){								//有新建项则加入输出多项式链表中
			r->next = s;
			r = s;
		}
	}	
}
int main(void){
	polynomialNode *inputHead[2];					//输入多项式链表的链表头
	polynomialNode *outputHead;						//输出多项式链表的链表头
	int i = 0;	
	for(i=0;i<2;++i){
		inputHead[i] = new polynomialNode();		//加上()会将结构体中的元素清零
		inputPolynomial(inputHead[i]);
		printPolynomial(inputHead[i]);
	}

	outputHead = new polynomialNode();
	addPolynomial(inputHead[0],inputHead[1],outputHead);
	printPolynomial(outputHead);
}


你可能感兴趣的:(ACM,南邮OJ,多项式加法)