天梯赛 L2-018 多项式A除以B

题目

这仍然是一道关于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

题解

前提:掌握多项式除法的数学知识.
数据结构:使用map<int, double>来存储多项式,键为阶数,值为系数.
使用递归来模拟多项式除法,直到被除数阶数小于除数阶数.
在得到结果(商和余数)之后,对其中舍入后为0.0的部分进行删除(注:由于在删除过程中改变容器容量,迭代器的使用要小心).
注意极端情况,为0多项式.

个人代码

#include <bits/stdc++.h>
using namespace std;
map<int, double, greater<>> shang;
map<int, double, greater<int>> yu;
map<int, double, greater<int>> beichu;
map<int, double, greater<int>> chushu;
void get_res(map<int, double, greater<int>> bei, \
             map<int, double, greater<int>> chu) {
    if (bei.empty() || chu.empty()) return;
    int bei_jie = (*bei.begin()).first;
    double bei_xi = (*bei.begin()).second;
    int chu_jie = (*chu.begin()).first;
    double chu_xi = (*chu.begin()).second;
    if (bei_jie<chu_jie) {
        yu = bei;
        return;
    }
    double mul = bei_xi/chu_xi;
    int def_jie = bei_jie-chu_jie;
    shang.insert({def_jie, mul});
    for (auto [jie, xi]: chu) {
        double new_xi = mul*xi;
        int new_jie = jie+def_jie;
        bei[new_jie] -= new_xi;
        if(bei[new_jie]==0) {
            bei.erase(bei.find(new_jie));
        }
    }
    get_res(bei, chu);
}
int main() {
    int N;
    cin>>N;
    for (int i = 0; i<N; i++) {
        int a, b;
        cin>>a>>b;
        beichu.insert({a, b});
    }
    cin>>N;
    for (int i = 0; i<N; i++) {
        int a, b;
        cin>>a>>b;
        chushu.insert({a, b});
    }
    get_res(beichu, chushu);

    for (auto it = shang.begin(); it!=shang.end();) {
        if (fabs(it->second)<0.05) {
            it=shang.erase(it);
        }
        else it++;
    }
    if (shang.size()==0) {
        printf("0 0 0.0\n");
    }
    else {
        cout << shang.size();
        for (auto &a: shang) {
            printf(" %d %.1lf", a.first, a.second);
        }
        cout << endl;
    }

    for (auto it = yu.begin(); it!=yu.end();) {
        if (fabs(it->second)<0.05) {
             it = yu.erase(it);
        }
        else it++;
    }
    if (yu.size()==0) {
        printf("0 0 0.0\n");
    }
    else {
        cout << yu.size();
        for (auto &a: yu) {
            printf(" %d %.1lf", a.first, a.second);
        }
        cout << endl;
    }
}
posted @ 2025-04-07 10:54  敲代码的cat  阅读(58)  评论(0)    收藏  举报