两种方法
1
#include <iostream>
using namespace std;
struct node
{
int x, y;
} P[2005];
//第一个用结构体 第二个直接输入
//用指数做下标 方便查找计算
int main()
{
int a, b, A[2005] = {0}, B[2008] = {0};
cin >> a;
int t1, t2;
for (int i = 0; i < a; i++)
{
cin >> P[i].x >> P[i].y;
//B是用来求和
B[P[i].y] += P[i].x;
}
cin >> b;
for (int i = 0; i < b; i++)
{
cin >> t1 >> t2;
//直接加到以t2为下标的元素里了
B[t2] += t1;
for (int j = 0; j < a; j++)
{
//A是求乘积
//遍历第一个式子
//指数相加 系数相乘
A[t2 + P[j].y] += (t1 * P[j].x);
}
}
//做标记用
int is = 1, h = 0;
for (int i = 2000; i >= 0; i--)
{
if (A[i] != 0)
{
if (!is)
cout << ' ' << A[i] << ' ' << i;
else
{
is = 0;
cout << A[i] << ' ' << i;
}
h = 1;
}
}
if (!h)
cout << "0 0";
cout << endl;
h = 0, is = 1;
for (int i = 1000; i >= 0; i--)
{
if (B[i] != 0)
{
if (!is)
{
cout << ' ' << B[i] << ' ' << i;
}
else
{
is = 0;
cout << B[i] << ' ' << i;
}
h = 1;
}
}
if (!h)
cout << "0 0";
cout << endl;
return 0;
}
2
用结构体来记录下标和指数 查询比较麻烦
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
const int MAX_N = 1e5;
struct node
{
int x;
int z;
};
int N_1, N_2;
node *read(int n)
{
node *polynomial;
polynomial = (struct node *)malloc(sizeof(struct node) * MAX_N);
for (int i = 0; i < n; i++)
{
int x, y;
cin >> x >> y;
polynomial[i].x = x;
polynomial[i].z = y;
}
return polynomial;
}
void sum(node polynomial_1[], node polynomial_2[])
{
int t = 0;
int index = 0;
node poly[MAX_N];
int i, j;
for (i = 0; i < N_1; i++)
{
for (j = t; j < N_2; j++)
{
if (polynomial_1[i].z == polynomial_2[j].z)
{
poly[index].z = polynomial_1[i].z;
poly[index++].x = polynomial_2[j].x + polynomial_1[i].x;
if (poly[index - 1].x == 0)
{
index--;
}
t++;
break;
}
else if (polynomial_1[i].z > polynomial_2[j].z)
{
poly[index++] = polynomial_1[i];
break;
}
else
{
poly[index++] = polynomial_2[j];
i--;
t++;
break;
}
}
if (t == N_2)
{
int p;
p = (i == 0 ? 0 : i + 1);
for (; p < N_1; p++)
{
poly[index++] = polynomial_1[p];
}
break;
}
}
if (t != N_2)
{
for (int p = t; p < N_2; p++)
poly[index++] = polynomial_2[p];
}
if (poly[0].x == 0)
{
cout << "0 0\n";
return;
}
for (int i = 0; i < index; i++)
{
cout << poly[i].x << ' ' << poly[i].z;
if (i != index - 1)
cout << ' ';
}
}
void multiply(node polynomial_1[], node polynomial_2[])
{
int index = 0;
node poly[MAX_N];
for (int j = 0; j < N_2; j++)
{
for (int i = 0; i < N_1; i++)
{
poly[index].x = polynomial_1[i].x * polynomial_2[j].x;
poly[index++].z = polynomial_1[i].z + polynomial_2[j].z;
if (poly[index - 1].x == 0)
poly[index - 1].z = 0;
}
}
for (int i = 0; i < index; i++)
{
for (int j = i + 1; j < index; j++)
{
if (poly[i].z == poly[j].z)
{
poly[i].x += poly[j].x;
if (poly[i].x == 0)
poly[i].z = -1;
poly[j].z = -1;
}
}
}
if (poly[0].x == 0)
{
cout << "0 0\n";
return;
}
for (int i = 0; i < index; i++)
{
if (poly[i].z == -1)
continue;
if (i != 0)
cout << ' ';
cout << poly[i].x << ' ' << poly[i].z;
}
printf("\n");
}
int main()
{
node *polynomial_1, *polynomial_2;
cin >> N_1;
polynomial_1 = read(N_1);
cin >> N_2;
polynomial_2 = read(N_2);
multiply(polynomial_1, polynomial_2);
sum(polynomial_1, polynomial_2);
return 0;
}