算法
模拟多项式除法即可(直接看代码吧,注释标了过程)
AC代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e4 + 10;
double a[N], b[N], q[N]; // a[i]:多项式A中指数为i的对应位置上的系数,b[i]: 多项式B中指数为i的对应位置上的系数,q[i]:商多项式中指数为i的对应位置上的系数
int n, m; // a、b多项式的长度
struct Node
{
int e;
double c;
};
void my_print(vector<Node> &ans)
{
int n = ans.size();
printf("%d ", n);
for (int i = 0; i < n; ++ i)
{
printf("%d %.1lf", ans[i].e, ans[i].c);
if (i != n - 1) printf(" ");
}
if(n) printf("\n");
else printf("0 0.0\n");
}
int main(void)
{
scanf("%d", &n);
int maxe1 = 0, maxe2 = 0; // 存A、B多项式中最高指数
int e;
double c;
for (int i = 1; i <= n; ++ i)
{
scanf("%d%lf", &e, &c);
maxe1 = max(maxe1, e);
a[e] = c;
}
scanf("%d", &m);
for (int i = 1; i <= m; ++ i)
{
scanf("%d%lf", &e, &c);
maxe2 = max(maxe2, e);
b[e] = c;
}
for (int i = maxe1; i >= maxe2; -- i)
{ // 将a中指数大于b多项式最高项或等于的全消灭掉
int te = i - maxe2; // 需要补的指数差
double tc = a[i]/ b[maxe2];
q[te] = tc;
for (int j = 0; j <= maxe2; ++ j)
{
int idx = j + te;
a[idx] -= tc * b[j];
}
a[i] = 0;
}
vector<Node> ans;
// 求商
for (int i = maxe1; i >= 0; -- i)
{
if (fabs(q[i]) >= 0.05) ans.push_back({i, q[i]});
}
my_print(ans);
ans.clear();
// 求余数
for (int i = maxe2; i >= 0; -- i)
{
if (fabs(a[i]) >= 0.05) ans.push_back({i,a[i]});
}
my_print(ans);
return 0;
}