L2-018 多项式A除以B (25 分)

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
有递推关系式:
初始状态: R 0 = A R_{0} = A Q = 0 Q=0 k = 0 k=0

  1. i f   R k = = 0   o r   R k B , 5 if\ R_k == 0\ or\ R_k的最高次指数小于B的最高次指数, 跳转到5
  2. T k = B [ 0 ] R k [ 0 ]   , B [ 0 ] B T_k = \frac{B[0]}{R_{k}[0]}\ ,B[0]表示多项式B的第一项(最高项)
  3. Q [ k ] = T k Q[k] = T_{k}
  4. R k + 1 = R k B × T k k + + 1 R_{k+1} = R_{k} - B \times T_k,k++,跳转到1
  5. 算法结束,输出 Q R = R k Q,R=R_{k}
代码
#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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43264529/article/details/88883186