1. 程式人生 > >PTA 7-2 一元多項式的乘法與加法運算 (20 分)

PTA 7-2 一元多項式的乘法與加法運算 (20 分)

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;
}