跳转至

DS线性表—多项式相加

时间限制: 1 Sec 内存限制: 128 MB

题目描述

对于一元多项式p(x) = p_{0} + p_{1}x + p_{2}x^{2} + … + p_{n}x^{n},每个项都有系数和指数两部分,例如p_{2}x^{2}的系数为p_{2},指数为2

编程实现两个多项式的相加。

例如5 + x + 2x^{2} + 3x^{3}-5 - x + 6x^{2} + 4x^{4},两者相加结果:8x^{2} + 3x^{3} + 4x^{4}

其中系数5和-5都是x的0次方的系数,相加后为0,所以不显示。x的1次方同理不显示。

可用顺序表或单链表实现。

输入

第1行:输入t表示有t组测试数据

第2行:输入n表示有第1组的第1个多项式包含n个项

第3行:输入第一项的系数和指数,以此类推输入n行

接着输入m表示第1组的第2个多项式包含m项

同理输入第2个多项式的m个项的系数和指数

参考上面输入第2组数据,以此类推输入t组

假设所有数据都是整数

输出

对于每1组数据,先用两行输出两个原来的多项式,再用一行输出运算结果,不必考虑结果全为0的情况

输出格式参考样本数据,格式要求包括:

1.如果指数或系数是负数,用小括号括起来。

2.如果系数为0,则该项不用输出。

3.如果指数不为0,则用符号^表示,例如x的3次方,表示为x^3。

4.多项式的每个项之间用符号+连接,每个+两边加1个空格隔开。

样例输入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
2
4
5 0
1 1
2 2
3 3
4
-5 0
-1 1
6 2
4 4
3
-3 0
-5 1
2 2
4
9 -1
2 0
3 1
-2 2

样例输出

1
2
3
4
5
6
5 + 1x^1 + 2x^2 + 3x^3
(-5) + (-1)x^1 + 6x^2 + 4x^4
8x^2 + 3x^3 + 4x^4
(-3) + (-5)x^1 + 2x^2
9x^(-1) + 2 + 3x^1 + (-2)x^2
9x^(-1) + (-1) + (-2)x^1

提示

解决方案

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <iostream>
#include <vector>
#include <algorithm>

class Poly {
public:
    struct Node {
        int coefficient, exponent;

        Node() = default;

        Node(int coefficient, int exponent) : coefficient(coefficient), exponent(exponent) {}

        Node operator+(const Node &rhs) {
            return {this->coefficient + rhs.coefficient, this->exponent};
        }

        bool operator<(const Node &rhs) const {
            return this->exponent < rhs.exponent;
        }

        friend std::ostream &operator<<(std::ostream &os, const Node &rhs) {
            if (rhs.coefficient < 0) {
                os << '(' << rhs.coefficient << ')';
            } else {
                os << rhs.coefficient;
            }
            if (rhs.exponent == 0) {
                return os;
            }
            os << "x^";
            if (rhs.exponent < 0) {
                return os << '(' << rhs.exponent << ')';
            } else {
                return os << rhs.exponent;
            }
        }
    };

    explicit Poly(int size) : poly(size) {}

    explicit Poly(std::vector<Node> &poly) : poly(poly) {}

    void setFromCin() {
        for (auto &item : this->poly) {
            std::cin >> item.coefficient >> item.exponent;
        }
    }

    Poly operator+(const Poly &rhs) {
        std::vector<Node> polyToReturn;
        size_t i1 = 0, i2 = 0;
        while (true) {
            const Node &node1 = this->poly[i1], &node2 = rhs.poly[i2];
            if (i1 == this->poly.size() && i2 == rhs.poly.size()) {
                break;
            }
            if (i1 == this->poly.size()) {
                polyToReturn.emplace_back(node2);
                i2 += 1;
                continue;
            }
            if (i2 == rhs.poly.size()) {
                polyToReturn.emplace_back(node1);
                i1 += 1;
                continue;
            }
            if (node1.exponent < node2.exponent) {
                polyToReturn.emplace_back(node1);
                i1 += 1;
            } else if (node1.exponent == node2.exponent) {
                polyToReturn.emplace_back(Node(node1.coefficient + node2.coefficient, node1.exponent));
                i1 += 1;
                i2 += 1;
            } else {
                polyToReturn.emplace_back(node2);
                i2 += 1;
            }
        }
        polyToReturn.erase(std::remove_if(polyToReturn.begin(), polyToReturn.end(),
                                          [](Node &node) { return node.coefficient == 0; }), polyToReturn.end());
        return Poly(polyToReturn);
    }

    friend std::ostream &operator<<(std::ostream &os, const Poly &rhs) {
        auto &polyToPrint = rhs.poly;
        os << polyToPrint.front();
        for (size_t i = 1; i < polyToPrint.size(); ++i) {
            os << " + " << polyToPrint[i];
        }
        return os;
    }

private:
    std::vector<Node> poly;
};

int main() {
    int T;
    std::cin >> T;

    while (T--) {
        int size;
        std::cin >> size;
        Poly lhs(size);
        lhs.setFromCin();
        std::cout << lhs << std::endl;
        std::cin >> size;
        Poly rhs(size);
        rhs.setFromCin();
        std::cout << rhs << std::endl;
        std::cout << lhs + rhs << std::endl;
    }

    return 0;
}

评论