7-9多項式AをBで割った値(25ポイント)

これはまだA / Bに関する質問ですが、AとBの両方が多項式に置き換えられています。2つの多項式の除算の商Qと剰余Rを計算する必要があります。ここで、Rの次数はBの次数よりも小さくする必要があります。

入力形式:
入力は2行に分割され、各行はゼロ以外の多項式を与え、最初にAを与え、次にBを与えます。各行の形式は次のとおりです。

N e [1] c [1]…e [N] c [N]
ここで、Nは多項式の非ゼロ項の数、e [i]はi番目の非ゼロ項の指数、およびc [i]は、i個の非ゼロ項の係数です。項目は指数の降順で指定され、すべての指数が異なる非負の整数であり、すべての係数が非ゼロの整数であり、すべての整数が整数の範囲内にあることを確認します。

出力形式:
商と剰余を2行ずつ次々に出力します。出力形式は入力形式と同じで、出力係数は小数点以下1桁を保持します。同じ行の数字は1スペースで区切られ、行の最初と最後に余分なスペースがあってはなりません。注:ゼロ多項式は特別な多項式であり、対応する出力は0 00.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 00.0に対応します。残りは残りに対応し、1つだけを出力するのではありません。0と見なされるかどうかは、小数点以下2桁を表示することです。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