L2-018 多项式A除以B (25 分)
这仍然是一道关于A/B的题,只不过A和B都换成了多项式。你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数。
输入格式:
输入分两行,每行给出一个非零多项式,先给出A,再给出B。每行的格式如下:
N e[1] c[1] … e[N] c[N]
其中N是该多项式非零项的个数,e[i]是第i个非零项的指数,c[i]是第i个非零项的系数。各项按照指数递减的顺序给出,保证所有指数是各不相同的非负整数,所有系数是非零整数,所有整数在整型范围内。
输出格式:
分两行先后输出商和余,输出格式与输入格式相同,输出的系数保留小数点后1位。同行数字间以1个空格分隔,行首尾不得有多余空格。注意:零多项式是一个特殊多项式,对应输出为0 0 0.0。但非零多项式不能输出零系数(包括舍入后为0.0)的项。在样例中,余多项式其实有常数项-1/27,但因其舍入后为0.0,故不输出。
输入样例:
4 4 1 2 -3 1 -1 0 -1
3 2 3 1 -2 0 1
输出样例:
3 2 0.3 1 0.2 0 -1.0
1 1 -3.1
题解
只需要实现多项式的加法和一位乘法就可以实现多项式除法(算法第4步)。
对于多项式除法:
A
/
B
=
Q
⋯
R
A/B=Q \cdots R
A/B=Q⋯R
有递推关系式:
初始状态:
R
0
=
A
R_{0} = A
R0=A,
Q
=
0
Q=0
Q=0,
k
=
0
k=0
k=0
- i f R k = = 0 o r R k 的 最 高 次 指 数 小 于 B 的 最 高 次 指 数 , 跳 转 到 5 if\ R_k == 0\ or\ R_k的最高次指数小于B的最高次指数, 跳转到5 if Rk==0 or Rk的最高次指数小于B的最高次指数,跳转到5;
- T k = B [ 0 ] R k [ 0 ] , B [ 0 ] 表 示 多 项 式 B 的 第 一 项 ( 最 高 项 ) T_k = \frac{B[0]}{R_{k}[0]}\ ,B[0]表示多项式B的第一项(最高项) Tk=Rk[0]B[0] ,B[0]表示多项式B的第一项(最高项);
- Q [ k ] = T k Q[k] = T_{k} Q[k]=Tk;
- R k + 1 = R k − B × T k , k + + , 跳 转 到 1 R_{k+1} = R_{k} - B \times T_k,k++,跳转到1 Rk+1=Rk−B×Tk,k++,跳转到1;
- 算法结束,输出 Q , R = R k Q,R=R_{k} Q,R=Rk;
代码
#include <bits/stdc++.h>
using namespace std;
struct Poly
{
vector<int> e; //指数
vector<float> c; //系数
};
void print(Poly A, const string name="")
{
for(size_t i=0;i<A.e.size();i++)
{
if(abs(A.c[i]) < 0.05)
{
A.e.erase(A.e.begin()+i);
A.c.erase(A.c.begin()+i);
i--;
}
}
int n = A.e.size();
if(n == 0)
{
cout << "0 0 0.0" << endl;
return ;
}
if(name!="") //debug使用
cout << name << " " << n ;
else
cout << n;
for(int i=0;i<n;i++)
{
printf(" %d", A.e[i]);
printf(" %.1f", A.c[i]);
}
cout << endl;
}
Poly add(Poly &A, Poly &B)
{
int n1 = A.e.size();
int n2 = B.e.size();
int p1 = 0, p2 = 0;
Poly C;
while(p1 != n1 && p2 != n2)
{
if(A.e[p1] > B.e[p2])
{
C.e.push_back(A.e[p1]);
C.c.push_back(A.c[p1]);
p1++;
}
else if(A.e[p1] < B.e[p2])
{
C.e.push_back(B.e[p2]);
C.c.push_back(B.c[p2]);
p2++;
}
else
{
C.e.push_back(A.e[p1]);
C.c.push_back(A.c[p1] + B.c[p2]);
p1++, p2++;
}
}
while(p1 != n1)
{
C.e.push_back(A.e[p1]);
C.c.push_back(A.c[p1]);
p1++;
}
while(p2 != n2)
{
C.e.push_back(B.e[p2]);
C.c.push_back(B.c[p2]);
p2++;
}
return C;
}
Poly mul(Poly &A, Poly &B) //B只有一项
{
Poly C;
int n = A.e.size();
for(int i=0;i<n;i++)
{
C.e.push_back(A.e[i] + B.e[0]);
C.c.push_back(A.c[i] * B.c[0]);
}
return C;
}
Poly division(Poly &A, Poly &B)
{
Poly T1;
T1.e.push_back(A.e[0] - B.e[0]);
T1.c.push_back(-(A.c[0] / B.c[0]));
Poly T2 = mul(B, T1);
A = add(A, T2);
A.e.erase(A.e.begin());
A.c.erase(A.c.begin());
return T1;
}
Poly division(Poly &A, Poly &B, Poly &Q)
{
Poly R = A;
while(!R.e.empty() && R.e[0] >= B.e[0])
{
Poly T = division(R, B);
Q.e.push_back(T.e[0]);
Q.c.push_back(-T.c[0]);
}
return R;
}
int main()
{
int n;
Poly A, B;
cin >> n;
int ee;
float cc;
for(int i=0;i<n;i++)
{
cin >> ee >> cc;
A.e.push_back(ee);
A.c.push_back(cc);
}
cin >> n;
for(int i=0;i<n;i++)
{
cin >> ee >> cc;
B.e.push_back(ee);
B.c.push_back(cc);
}
Poly Q,R;
R = division(A,B,Q);
print(Q);
print(R);
return 0;
}