求两个一元多项式的和。
输入格式:
需要输入两个多项式,每个多项式的输入格式如下:
(1)每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,遇到-1 -1
表示一个多项式输入结束;
(2)所有的系数都是整数,不输入系数为0
的数据项;
(3)每个多项式的幂值不超过100,且不重复。
输出格式:
从最高幂开始依次降到0幂,不输出系数为0 的项。如:
2x6+3x5+12x3-6x+20
注意:其中的x是小写字母x,而且所有的符号之间都没有空格。
输入样例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
输出样例1:
在这里给出相应的输出。例如:
4x6+6x5+12x3+12x2+12x+40
输入样例2:
在这里给出一组输入。例如:
6 1
1 1
-1 -1
5 -1
0 -1
-1 -1
输出样例2:
在这里给出相应的输出。例如:
x6-x5+x-1
输入样例3:
在这里给出一组输入。例如:
1 1
-1 -1
1 -1
-1 -1
输出样例3:
在这里给出相应的输出。例如:
0
感觉好烦人啊,一直有几个点过不去,搞了快一晚上,感觉还没有吃透,得多复习。
#include <stdio.h> /*巨烦人的一题*/
typedef struct wz
{ int mi;
int xi; /*结构体包含幂次和系数*/
}wz;
int main()
{ int mi,xi;
int i,j=0,flag=1;/*都有用*/
wz a[1001];
for(i=0;i<101;i++)
{ /*本来写了a[i].mi=i,但是后来改了几次感觉直接把i当成幂次就行*/
a[i].xi=0;
}
while(1) /*输入*/
{ scanf("%d%d",&mi,&xi);
if(mi==-1&&xi==-1) break;
a[mi].xi+=xi;
}
while(1) /*输入*/
{ scanf("%d%d",&mi,&xi);
if(mi==-1&&xi==-1) break;
a[mi].xi+=xi;
} /*下面的a[i].xi都是每一个幂次前的总系数*/
for(i=100;i>=0;i--)
{ if(a[i].xi!=0)/*可能会出现多项式为0的情况,用flag标记*/
{ flag=0;/*标记为0*/
j++;/*用j来判断是否输出+*/
if(i!=100&&a[i].xi>0)/*i!=100表明不是第一项,系数大于0*/
{ if(j>1)/*j从0开始,如果j>1,说明至少是第二项,那就可以输出+,第一项是不可以的*/
printf("+");
}
if(i!=100&&a[i].xi<0)
{ printf("-");/*系数小于0,直接输出一个-*/
a[i].xi=-a[i].xi;/*然后把小于0的化成绝对值,后面直接输出绝对值*/
}
if(i==0)/*幂次为0(用i标记幂次)*/
{ /*x0次方为1,直接输出系数*/
printf("%d",a[i].xi);/*如果系数是负的,无所谓,前面已经输出-了,这次直接输出数*/
}
else if(i==1&&a[i].xi==1)/*幂次为1要判断系数是1.-1或者都不是*/
{
printf("x");/*这种系数为1的情况就直接输出x就行了,(幂次为1)*/
}
else/*系数不为1*/
{ if(i==1)/*幂次为1*/
printf("%dx",a[i].xi);/*直接输出系数*/
else/*系数不为1*/
{ if(a[i].xi!=1&&a[i].xi!=-1)/*系数不为1也不为-1*/
printf("%dx%d",a[i].xi,i);/*正常输出前系数中间x后面幂次*/
else if(a[i].xi==1||a[i].xi==-1) //系数为1或-1,前面已经输出过符号
printf("x%d",i); //并且把负数变成正数了,所以直接输出就好*/
}
}
}
}
/*flag没变表示系数一直为0,所以最后输出0*/
if(flag==1) printf("0");
return 0;
}