#include<stdio.h>
void jh(int *a,int *b){
int t=*a;
*a=*b;
*b=t;
}
/*排序函数*/
int main(){
int a,b,in,po;
scanf("%d",&a);
int x[1005][2]={(0,0)};
int y[1005][2]={(0,0)};
/*0是系数,1是指数*/
for(int q=0;q<a;q++){
scanf("%d %d",&in,&po);
x[q][0]=in;
x[q][1]=po;
}
scanf("%d",&b);
for(int q=0;q<b;q++){
scanf("%d %d",&in,&po);
y[q][0]=in;
y[q][1]=po;
}
int z[2010][2]={(0,0)};
int k=0;
/*读入数据,设乘积数组z*/
for(int q=0;q<a;q++){
for(int w=0;w<b;w++){
if(x[q][0]!=0&&y[w][0]!=0){
int fen=0;
if(k==0){
z[0][0]+=x[0][0]*y[0][0];
z[0][1]=x[0][1]+y[0][1];
k++;
continue;
}
for(int e=0;e<k;e++){
if(z[e][1]==x[q][1]+y[w][1]){
z[e][0]+=x[q][0]*y[w][0];
break;
}
else{
fen++;
}
if(fen>=k){
z[k][1]=x[q][1]+y[w][1];
z[k][0]+=x[q][0]*y[w][0];
break;
}
}
k++;
}
}
}
/*把两个多项式逐项相乘*/
for(int q=0;q<k;q++){
for(int w=q+1;w<=k;w++){
if(z[q][1]>z[w][1]){
jh(&z[q][1],&z[w][1]);
jh(&z[q][0],&z[w][0]);
}
}
}
/*对z进行排序(懒得动脑,选择冒泡)*/
int o=0;
for(int q=k;q>=0;q--){
if((x[0][1]==0&&x[0][0]==0)||(y[0][1]==0&&y[0][0]==0)){
printf("0 0");
break;
}
/*测试点4:输入的数据有零多项式*/
if(z[q][0]!=0){
if(o==0){
printf("%d %d",z[q][0],z[q][1]);
o++;
}
else{
printf(" %d %d",z[q][0],z[q][1]);
}
}
}
/*解决末尾不能有空格,降序输出乘积*/
printf("\n");
in=0,po=0,o=0;
int pop=0;
/*pop用于解决多项式相抵消造成结构为零多项式*/
for(int q=0;q<a+b;q++){
if(x[in][1]>y[po][1]){
if(o==0){
printf("%d %d",x[in][0],x[in][1]);
o++;
}
else{
printf(" %d %d",x[in][0],x[in][1]);
}
in++;
}
else if(x[in][1]<y[po][1]){
if(o==0){
printf("%d %d",y[in][0],y[in][1]);
o++;
}
else{
printf(" %d %d",y[in][0],y[in][1]);
}
po++;
}
else{
if(x[in][0]+y[po][0]==0){
po++;
in++;
pop++;
continue;
}
if(o==0){
printf("%d %d",x[in][0]+y[po][0],x[in][1]);
o++;
}
else{
printf(" %d %d",x[in][0]+y[po][0],x[in][1]);
}
po++;
in++;
}
}
/*轮流取指数最大的输出,同指数跳过和为0,并且pop++*/
if(pop>=a+b){
printf("0 0");
}
/*当所有项都是0时则结果为零多项式*/
}
大学马上要开学啦,数据结构的学习也完成了,开始解决PAT上的折磨题
个人习惯不好,所以写出了很抽象的代码ovo
这是PTA上MOOC浙大数据结构的课后习题,花了半小时写了120行码才AC(我好菜)
注释比较简略,毕竟应该没人看QAQ
如果有大佬有更好的算法(乘法部分),膜拜求解