Description
一个多项式可以表达为x的各次幂与系数乘积的和,比如:2x
6+3x
5+12x
3+6x+20,现在你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。幂最大为100。
Input
首先输入一个整数t,表示有t组数据。
每组测试要输入两个多项式,每个多项式对应多行输入,格式如下:
每行输入两个数字 k 和 a,对应多项式的某一项。 k 表示该项的幂次( k 为不大于100的非负整数), a 表示该项的系数(整数)。输入第一行一定是幂次最高项,输入的最后一行一定是幂次最低项,但第一行和最后一行之间不一定按幂次降序排列。若幂次和系数同时为-1表示输入结束(此输入不对应有效项)。
如果多项式某项的系数为0,则输入不含该项。
Output
输出多项式,各项按幂次从高到低排列,如:2x6+3x5+12x3-6x+20
注意:其中的x是小写字母x;所有符号之间没有空格;输出时省略系数为0的项。
Sample Input
1 6 2 5 3 3 12 1 6 0 20 -1 -1 6 2 5 3 2 12 1 6 0 20 -1 -1
Sample Output
4x6+6x5+12x3+12x2+12x+40
HINT
%+d 可输出符号,正号或负号
如果有语言可以表达我目前的心情的话,那大概是:哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈!Xn
这破题,我能说我用最蠢的方法做完之后才发现有hint吗(吐)
总之……激动完了继续刷题,唉。_(:з」∠)_
#include<stdio.h>
#include<string.h>
int a[100][4],b[100][4],c[1000][4],d[1000][4];
int main()
{
int n,x,y,i1,i2,i,k,j,h,o;
while(~scanf("%d",&n))
{
while(n--)
{
for(i1=1;i1!=0;i1++)
{
for(j=1;j<=2;j++)
{
scanf("%d",&a[i1][j]);
}
if(a[i1][1]==-1&&a[i1][2]==-1)
break;
}
for(i2=1;i2!=0;i2++)
{
for(j=1;j<=2;j++)
{
scanf("%d",&b[i2][j]);
}
if(b[i2][1]==-1&&b[i2][2]==-1)
break;
}
if(a[1][1]>b[1][1])
x=a[1][1];
else
x=b[1][1];
if(a[i1-1][1]>b[i2-1][1])
y=b[i2-1][1];
else
y=a[i1-1][1];
memset(c,0,sizeof(c));
int w=x-y;
for(o=1;x>=y;o++)
{
c[o][1]=x;
x--;
}
for(k=1;k<=w+1;k++)
{
for(h=1;h<i1;h++)
{
if(c[k][1]==a[h][1])
{
c[k][2]+=a[h][2];
}
}
}
for(k=1;k<=w+1;k++)
{
for(h=1;h<i2;h++)
{
if(c[k][1]==b[h][1])
{
c[k][2]+=b[h][2];
}
}
}
for(i=1,k=1;i<=w+1;x++,i++)
{
if(c[i][2]!=0)
{
d[k][2]=c[i][2];
d[k][1]=c[i][1];
k++;
}
}
if(k==1)
{
printf("0\n");
}
else
{
for(i=1;i<k-1;i++)
{
if(d[i][2]==1);
else if(d[i][2]==-1)
printf("-");
else
printf("%d",d[i][2]);
printf("x");
if(d[i][1]==1);
else
printf("%d",d[i][1]);
if(d[i+1][2]>0)
printf("+");
else if(d[i+1][2]<-1);
}
if(d[i][1]==0)
printf("%d\n",d[i][2]);
else
{
if(d[i][2]==1);
else if(d[i][2]==-1)
printf("-");
else
printf("%d",d[i][2]);
printf("x");
if(d[i][1]==1)
printf("\n");
else
printf("%d\n",d[i][1]);
}
}
}
}
return 0;
}