基于顺序表的两个一元多项式的基本运算
描述
给定两个一元多项式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。
样例输入1
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
'
样例输出1
1x^1+1
5x^17+22x^7+11x^1+7
0
1
1
解答:由于指数范围为-100到100,所以用指数加100对应数组位置保存相应的系数。特别要注意输出格式,以及符号!
#include<stdio.h>
#define maxn 222
int e1[maxn];
int e2[maxn];
int ans[2*maxn];
int main()
{
int T;
int a,b;
int x,y;
char op;
scanf("%d",&T);
while(T--)
{
for(int i=0; i<maxn; i++)
{
e1[i]=0;
e2[i]=0;
}
for(int i=0; i<2*maxn; i++)
{
ans[i]=0;
}
scanf("%d %d\n",&a,&b);
while(a--)
{
scanf("%d %d",&x,&y);
e1[y+100]+=x;
}
while(b--)
{
scanf("%d %d",&x,&y);
e2[y+100]+=x;
}
getchar();
scanf("%c",&op);
int first=1;
if(op=='+')
{
for(int i=0; i<maxn; i++)
{
e1[i]+=e2[i];
}
for(int i=221; i>=0; i--)
{
if(e1[i])
{
if(first)
{
if(i-100==0)
printf("%d",e1[i]);
else
printf("%dx^%d",e1[i],i-100);
first=0;
}
else
{
if(e1[i]>0)
printf("+");
if(i-100==0)
printf("%d",e1[i]);
else
printf("%dx^%d",e1[i],i-100);
}
}
}
if(first)
printf("0\n");
else
printf("\n");
}
if(op=='-')
{
for(int i=0; i<maxn; i++)
{
e1[i]-=e2[i];
}
for(int i=221; i>=0; i--)
{
if(e1[i])
{
if(first)
{
if(i-100==0)
printf("%d",e1[i]);
else
printf("%dx^%d",e1[i],i-100);
first=0;
}
else
{
if(e1[i]>0)
printf("+");
if(i-100==0)
printf("%d",e1[i]);
else
printf("%dx^%d",e1[i],i-100);
}
}
}
if(first)
printf("0\n");
else
printf("\n");
}
if(op=='*')
{
int x,y;
for(int i=0; i<maxn; i++)
{
if(e1[i]==0)
continue;
for(int j=0; j<maxn; j++)
{
if(e2[j]==0)
continue;
x=e1[i]*e2[j];
y=i+j;
ans[y]+=x;
}
}
for(int i=410; i>=0; i--)
{
int x=ans[i];
int y=i-200;
if(x)
{
if(first)
{
if(y==0)
printf("%d",x);
else
printf("%dx^%d",x,y);
first=0;
}
else
{
if(x>0)
printf("+");
if(y==0)
printf("%d",x);
else
printf("%dx^%d",x,y);
}
}
}
if(first)
printf("0\n");
else
printf("\n");
}
if(op=='\'')
{
for(int i=210; i>=0; i--)
{
if(e1[i])
{
int x=(i-100)*e1[i];
int y=i-100-1;
if(x)
{
if(first)
{
if(y==0)
printf("%d",x);
else
printf("%dx^%d",x,y);
first=0;
}
else
{
if(x>0)
printf("+");
if(y==0)
printf("%d",x);
else
printf("%dx^%d",x,y);
}
}
}
}
if(first)
printf("0\n");
else
printf("\n");
first=1;
for(int i=210; i>=0; i--)
{
if(e2[i])
{
int x=(i-100)*e2[i];
int y=i-100-1;
if(x)
{
if(first)
{
if(y==0)
printf("%d",x);
else
printf("%dx^%d",x,y);
first=0;
}
else
{
if(x>0)
printf("+");
if(y==0)
printf("%d",x);
else
printf("%dx^%d",x,y);
}
}
}
}
if(first)
printf("0\n");
else
printf("\n");
}
}
return 0;
}