任务描述
本关任务:给定两个一元多项式A(x)与B(x),利用链表表示A(x)与B(x),实现A(x)与B(x)的加法、减法、乘法和求导运算。
编程要求
输入
输入多组数据,总计n*( a+b+2)+1行。其中,第一行整数n代表总计有n组数据,之后依次输入n组数据。每组数据包括a+b+2行,其中第一行是两个整数a和b,分别代表A(x)与B(x)的项数。之后紧跟a行,每行两个整数a1和a2,分别代表A(x)每项的系数和指数,再之后紧跟b行,每行两个整数b1和b2,分别代表B(x)每项的系数和指数,每组数据最后一行为一个字符(+、-、*、'),分别代表多项式的加法、减法、乘法和求导运算。所有数据的绝对值小于100,指数大于等于0。
输出
对于每组数据输出一行,按照多项式次数从大到小排列,参考格式:5x^17+22x^7+11x^1+7。
测试说明
平台会对你编写的代码进行测试:
测试输入: 4
1 1
1 0
1 1
+
4 3
7 0
3 1
9 8
5 17
8 1
22 7
-9 8
+
1 1
1 1
1 1
-
1 1
1 1
1 1
'
预期输出: 1x^1+1
5x^17+22x^7+11x^1+7
0
1
1
#include <iostream>
#include <string>
using namespace std;
typedef struct LNode
{
int coe; //系数coe
int exp; //指数exp
struct LNode *next;
}LNode,*LinkList;
void CreatePolynomial(LinkList &L,int n)
{//按指数exp从大到小存多项式
L=new LNode;
L->next=NULL;
for(int i=0;i<n;i++)
{
LinkList p=new LNode;
cin>>p->coe>>p->exp;
LinkList pre=L,cur=L->next; //pre和cur是多项式链表的工作指针,分别初始化为头结点和首元结点
while(cur&&p->exp<cur->exp) //若待插入项的指数小于当前结点的指数,指针pre指向当前结点,当前结点的指针cur后移
{
pre=cur;
cur=cur->next;
}
p->next=cur; //待插入项的指数不小于当前结点的指数时,用头插法插入节点
pre->next=p;
}
}
void OutputPolynomial(LinkList L)
{//输出多项式
if(!L||!L->next) cout<<0;
LinkList p=L->next; //p是多项式链表的工作指针,初始化为首元结点
while(p)
{
if(p==L->next) //p指向首元结点时,根据指数的情况输出多项式
{
if (p->exp!=0)
cout<<p->coe<<"x^"<<p->exp;
else
cout<<p->coe;
}
else //p指向其他结点时,根据系数的正负和指数的情况输出多项式
{
if(p->coe>0) cout<<"+";
if(p->exp!=0)
cout<<p->coe<<"x^"<<p->exp;
else
cout<<p->coe;
}
p=p->next;
}
cout<<endl;
}
LinkList Add(LinkList LA,LinkList LB)
{//多项式的加法运算
/**************begin************/
LinkList LC,pa,pb,pc;
pa=LA->next;
pb=LB->next;
CreatePolynomial(LC,0);
pc=LC;
while(pa&&pb){
if(pa->exp==pb->exp){
int sum=pa->coe+pb->coe;
if(sum){
pa->coe=sum;
pc->next=pa;
pc=pa;
pa=pa->next;
pb=pb->next;
}
else{
pa=pa->next;
pb=pb->next;
}
}
else if(pa->exp>pb->exp){
pc->next=pa;
pc=pa;
pa=pa->next;
}
else{
pc->next=pb;
pc=pb;
pb=pb->next;
}
}
pc->next=pa?pa:pb;
return LC;
/**************end************/
}
void Minus(LinkList LA,LinkList LB)
{//多项式的减法
/**************begin************/
LinkList p=LB->next;
while(p){
p->coe*=-1;
p=p->next;
}
OutputPolynomial(Add(LA,LB));
/**************end************/
}
void Mul(LinkList LA,LinkList LB)
{//多项式的乘法
/**************begin************/
LinkList LC;
LinkList pa=LA->next;
LinkList pb=LB->next;
CreatePolynomial(LC,0);
LinkList temp;
CreatePolynomial(temp,0);
while(pa){
while(pb){
LinkList p=new LNode;
p->next=NULL;
p->coe=pa->coe*pb->coe;
p->exp=pa->exp+pb->exp;
temp->next=p;
LC=Add(LC,temp);
pb=pb->next;
}
pb=LB->next;
pa=pa->next;
}
OutputPolynomial(LC);
/**************end************/
}
void Diff(LinkList L)
{//多项式的求导运算
LinkList p=L->next; //p是链表L的工作指针,初始化为首元结点
LinkList r=NULL; //r是删除操作的辅助指针
while(p)
{
p->coe*=p->exp;
p->exp--;
if(p->exp<0) //所有数据的指数大于等于0
{
r=p;
p=p->next;
delete r;
}
else
{
p=p->next;
}
}
OutputPolynomial(L);
}
void Opt(LinkList &LA,LinkList &LB,string s)
{//依据字符选择多项式的加法、减法、乘法和求导运算
if(s=="+") OutputPolynomial(Add(LA, LB));
if(s=="-") Minus(LA, LB);
if(s=="*") Mul(LA, LB);
if(s=="'")
{
Diff(LA);
Diff(LB);
}
}
int main()
{
int n; //总计有n组数据
cin>>n;
while(n--)
{
int a,b;
cin>>a>>b;
LinkList LA,LB;
CreatePolynomial(LA,a);
CreatePolynomial(LB,b);
string s;
cin>>s;
Opt(LA,LB,s);
}
return 0;
}