7-9 多项式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

模拟多项式除法,高中的时候帅气的数学老师解题的时候给我们演示过几次,没在意,觉得用不到,听听就行了,一看这题傻眼了,百度看了看怎么算的,这才算有点思路,最后输出那老是出问题,注意商和余数分开输出,商的零多项式,输出商对应的0 0 0.0,余数对应余数的,别只输出一个。是否看作0是要看到小数点两位的,和0.05比较就行,四舍五入
附上计算过程,应该没有算错。。

在这里插入图片描述

关于小数位数的保留,最近做题总发现之前理解的有问题,只好自己测试例子,记住结果

在这里插入图片描述

#include <cmath>
#include <iostream>
#include <map>
using namespace std;

int main() {
    
    
    int n1, n2;
    cin >> n1;
    map<int, double> m1, m2; // m1存储被除数(包括最后的余数),m2存储商
    int a[100000];           //存储除数的指数
    double b[100000]; //存储除数的系数
    int e, max1 = 0, max2 = 0;
    double c;
    for (int i = 0; i < n1; i++) {
    
    
        cin >> e >> c;
        m1[e] = c;
        if (i == 0)
            max1 = e;
    }
    cin >> n2;
    for (int i = 0; i < n2; i++) {
    
    
        cin >> a[i];    //除数的指数
        cin >> b[a[i]]; //除数的系数
        if (i == 0)
            max2 = a[i];
    }
    int i = max1;
    while (i >= max2) {
    
    
        int diff = i - a[0];
        m2[diff] = m1[i] / b[a[0]];
        for (int j = 0; j < n2; j++) {
    
    
            m1[diff + a[j]] -= m2[diff] * b[a[j]];
        }
        i--;
    }
    int cnt1 = 0, cnt2 = 0;
    for (auto it = m1.begin(); it != m1.end(); it++) {
    
    
        if (abs(it->second) < 0.05)
            it->second = 0;
        else
            cnt1++;
    }
    for (auto it = m2.begin(); it != m2.end(); it++) {
    
    
        if (abs(it->second) < 0.05)
            it->second = 0;
        else
            cnt2++;
    }
    if (cnt2 == 0)
        cout << "0 0 0.0";
    else {
    
    
        cout << cnt2;
        for (i = max1; i >= 0; i--) {
    
    
            if (m2[i])
                printf(" %d %.1lf", i, m2[i]);
        }
    }
    cout << endl;
    if (cnt1 == 0)
        cout << "0 0 0.0";
    else {
    
    
        cout << cnt1;
        for (i = max1; i >= 0; i--) {
    
    
            if (m1[i])
                printf(" %d %.1lf", i, m1[i]);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45845039/article/details/112916512