南邮 OJ 1006 多项式乘法

多项式乘法

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

比赛描述

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

现给两个一元整系数多项式,请求解两者的乘积。



输入

两组数据,每一组代表一个一元整系数多项式,有多行组成,其中每一行给出多项式每一项的系数和指数,这些行按指数递减次序排序。每一组结束行输入为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
6X^24+12X^22-16X^18-50X^16+12X^12+76X^10+8X^8-36X^4-12X^2

提示

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

题目来源

CHENZ


#include<iostream>
using namespace std;

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

/*
*功能说明:打印多项式
*入口参数:head:将要打印的多项式;
*出口参数:无
*/
void printPolynomial(polynomial 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,这种情况系数1就不能省略了			
			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;
}

/*
*功能说明:添加一个元素到多项式链表;
*入口参数:head:            多项式的头指针;
         :tempCoefficient: 将要添加元素的系数
		 :tempExponent   : 将要添加元素的系数
*出口参数:无
*/
void addElementToPolynomial(polynomial head,int tempCoefficient,int tempExponent){
	polynomialNode *p,*q;
	p = head;
	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;
		}
	}
}

/*
*功能说明:输入一个多项式;
*入口参数:inputHead:       多项式的头指针;
         :tempCoefficient: 将要添加元素的系数
		 :tempExponent   : 将要添加元素的系数
*出口参数:无
*/
void inputPolynomial(polynomial inputHead){
	int tempCoefficient;
	int tempExponent;
	while(cin>>tempCoefficient>>tempExponent &&\
		(tempCoefficient!=0 || tempExponent!=-1)){
		if(tempCoefficient == 0)								//系数为0,不增加节点
			continue;	
		addElementToPolynomial(inputHead,tempCoefficient,tempExponent);
	}
}

/*
*功能说明:多项式加法,out=add1+add2
*入口参数:add1:多项式1
*          add2:多项式2
*出口参数:out :输出多项式
*/
void addPolynomial(polynomial add1,polynomial add2,polynomial sum){
	polynomialNode *p,*q;
	p = add1->next;					//指向add1的一项
	q = add2->next;					//指向add2中的一项
	while(p!=NULL){
		addElementToPolynomial(sum,p->coefficient,p->exponent);
		p = p->next;
	}
	while(q!=NULL){
		addElementToPolynomial(sum,q->coefficient,q->exponent);
		q = q->next;
	}
}
/*
*功能说明:释放多项式内存
*入口参数:head:将要释放的多项式;
*出口参数:无
*/
/*
void delePolynomial(polynomial head){
	polynomialNode *p =NULL;
	while(head!=NULL){
		p = head;
		head = head->next;
		delete p;
		p = NULL;
	}
}*/

/*
*功能说明:多项式乘法,out=m1*m2
*入口参数:m1: 多项式1
*          m2: 多项式2
*出口参数:out:输出多项式
*/
void multiply(polynomial m1,polynomial m2,polynomial out){
	polynomialNode *p,*q;
	p = m1->next;
	while(p!=NULL){											//m1的每一项与m2相乘
		q = m2->next;
		while(q!=NULL){
			addElementToPolynomial(out,p->coefficient*q->coefficient,p->exponent+q->exponent);
//			printPolynomial(out);
			q = q->next;
		}
		p = p->next;
	}
}

int main(void){
	polynomial inPolynomial[2];				//输入多项式
	polynomial outPolynomial;				//输出多项式
	int i = 0;	
	for(i=0;i<2;++i){
		inPolynomial[i] = new polynomialNode();	//加上()会将结构体中的元素清零
		inputPolynomial(inPolynomial[i]);
		printPolynomial(inPolynomial[i]);
	}
	outPolynomial = new polynomialNode();
	multiply(inPolynomial[0],inPolynomial[1],outPolynomial);
	printPolynomial(outPolynomial);
	return 0;
}



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