您的位置:首页 > 其它

南邮 OJ 1005 多项式加法

2015-08-03 09:53 369 查看

多项式加法

时间限制(普通/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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息