多项式其实就是以被除数的最高项为基础,求出相应的指数和系数;然后乘以B,然后减去更新A(注意这里A式一直变的, B是一直不变的);
问题:
1: A中如图没有X的3次方怎么办?
2: 如何更新A
3: 存底数, 指数, 用什么?
4 : 怎样统计结果的组数
5: 怎么遍历这个多项式, (应该想到以所有的指数从大到小遍历进行运算)
6: 每次的减数应该存一下
7: 只需要再开一个map存商就对了,余数就直接是A
参考的博客:
#include<bits/stdc++.h>
using namespace std;
unordered_map<int,double> a,b,tmp,res;
int maxxa = -1,maxxb = -1,maxxres = -1;
const double minn = 0.0000001;
int main()
{
int k,e,c;
cin >> k;
for(int i = 0; i < k; i ++)
{
cin >> e >> c;
a[e] = c;
maxxa = max(maxxa,e);
}
cin >> k;
for(int i = 0; i < k; i ++)
{
cin >> e >> c;
b[e] = c;
maxxb = max(maxxb,e);
}
int ope,tmax;
double opc;
while(maxxa >= maxxb)
{
tmax = -1;
opc = a[maxxa] / b[maxxb];//b多项式要乘的系数
ope = maxxa - maxxb;
res[ope] = opc;
//对应指数的系数
maxxres = max(maxxres,ope);
//maxxb是最大的指数
for(int i = maxxb; i >= 0; i --)//得到减数
{
tmp[i + ope] = opc * b[i];
}
for(int i = maxxa; i >= 0; i --)//更新a
{
a[i] -= tmp[i];
if(fabs(a[i]) >= minn)//这个是图中X的3次方没有的情况;
tmax = max(tmax,i);
}
maxxa = tmax;
}//最后,a里面存的是余数
//上面这个循环求-- 商
//求商
int num = 0;
for(int i = maxxres; i >= 0; i --)
{
if(fabs(res[i]) >= 0.05) num ++;
}
if(num == 0) cout << "0 0 0.0" << endl;
else
{
cout << num;
for(int i = maxxres; i >= 0; i --)
{
if(fabs(res[i]) >= 0.05)
{
printf(" %d %0.1f",i,res[i]);
}
}
puts("");
}
// 求余
num = 0;
for(int i = maxxa; i >= 0; i --)
if(fabs(a[i]) >= 0.05)
num++;
if(num == 0) cout << "0 0 0.0" << endl;
else
{
cout << num;
for(int i = maxxa; i >= 0; i --)
if(fabs(a[i]) >= 0.05)
printf(" %d %0.1f",i,a[i]);
puts("");
}
return 0;
}