7-2 一元多项式的乘法与加法运算 (20 分)

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

 

#include <iostream>
#include <algorithm>
using namespace std;
const int MAX = 1e7+1000;
struct hh{
	int a;
	int x;
}a[MAX],b[MAX],c[MAX],d[MAX],e[MAX];
bool cmp(hh a,hh b){
	return a.x > b.x;
}
int main(){
	int n,m;
	cin >> n;
	for (int i = 0; i < n;i++){
		cin >> a[i].a >> a[i].x;
	}
	cin >> m;
	for (int i = 0; i < m;i++){
		cin >> b[i].a >> b[i].x;
	}
	int index1,index2;
	int num=0;
	for (index1 = 0,index2=0; index1 < n&&index2<m;){//加法
		if(a[index1].x==b[index2].x){
			d[num].a=a[index1].a+b[index2].a;
			d[num++].x=a[index1].x;
			index1++;
			index2++;
		}
		else{
			if(a[index1].x>b[index2].x){
				d[num].a=a[index1].a;
				d[num++].x=a[index1].x;
				index1++;
			}
			else {
				d[num].a=b[index2].a;
				d[num++].x=b[index2].x;
				index2++;
			}
		}
	}
	if(index1!=n){//加法
		for (int i = index1;i < n;i++){
			d[num].a=a[index1].a;
			d[num++].x=a[index1].x;
		}
	}
	if(index2!=m){//加法
		for (int i = index2;i < m;i++){
			d[num].a=b[index1].a;
			d[num++].x=b[index1].x;
		}
	}
	int sum=0;
	for (int i = 0; i < n;i++){//乘法
		for (int j = 0; j < m;j++){
			c[sum].a=a[i].a*b[j].a;
			c[sum++].x=a[i].x+b[j].x;
		}
	}
	sort(c,c+n*m,cmp);//乘法 为了去掉指数相同的
	e[0].a=c[0].a;
	e[0].x=c[0].x;
	int ww=0;
	for (int i = 1; i < sum;i++){//乘法 指数想同的求和
		if(c[i].x==e[ww].x){
			e[ww].a+=c[i].a;
			e[ww].x=c[i].x;
		}
		else {
			e[++ww].a=c[i].a;
			e[ww].x=c[i].x;
		}
	}
	int f=0;//标记是否有输出
	int ji2=0;
	for (int i = 0; i <= ww;i++){//加法求和完成后去掉系数0项
		if(e[i].a==0) continue;
		else {
			e[ji2].a=e[i].a;
			e[ji2++].x=e[i].x;
		}
	}
	for (int i = 0; i < ji2;i++){//输出注意格式
		if(i!=ji2-1) cout << e[i].a << " " << e[i].x << " ",f=1;
		else cout << e[i].a << " " << e[i].x << endl,f=1;
	}
	if(f==0){ //上面没有输出就是0多项式
		cout << 0 << " " << 0 << endl; 
	}
	f=0;
	int ji1=0;
	for (int i = 0; i < num;i++){//乘法求和完成后去掉系数0项
		if(d[i].a==0) continue;
		else {
			d[ji1].a=d[i].a;
			d[ji1++].x=d[i].x;
		}
	}
	for (int i = 0; i < ji1;i++){//输出注意格式
		if(i!=ji1-1) cout << d[i].a << " " << d[i].x << " ",f=1;
		else cout << d[i].a << " " << d[i].x << endl,f=1;
	}
	if(f==0){//上面没有输出就是0多项式
		cout << 0 << " " << 0 << endl; 
	}
	return 0;
}