题目描述
输入两个多项式,计算它们的和。 每个多项式有若干对整数表示,每组整数中,第一个整数表示系数(非0),第二个整数表示该项的次数。 如由3 3 5 -2 1 4 0表示3x^5 - 2 * x + 4其中第一个3表示该多项式由三个整数对表示。
输入描述
输入为两行,分别表示两个多项式。表示每项的整数对按照次数大小降序给出。(次数绝对值小于1000,系数绝对值小于10000)
输出描述
按照降次顺序输出表示和多项式的整数对(系数为0的整数对不用输出,整数对由空格分隔,最后一个整数对后不添加空格)
输入
3 3 5 -2 1 4 0
4 2 3 -1 2 1 1 3 0
输出
3 5 2 3 -1 2 -1 1 7 0
#include <stdio.h>
#include <map>
#include <iostream>
#include <vector>
using namespace std;
map<int, int> add(map<int, int> m1, int m, map<int, int> m2, int n) {
map<int, int> res;
// int i, j;
map<int, int>::iterator iter_m1;
map<int, int>::iterator iter_m2;
for (iter_m1 = m1.begin(), iter_m2 = m2.begin(); (iter_m1 != m1.end())&&(iter_m2 != m2.end()); ) {
if (iter_m1->first > iter_m2->first) {
res.insert(pair<int, int>(iter_m2->first, iter_m2->second));
iter_m2++;
} else if (iter_m1->first < iter_m2->first) {
res.insert(pair<int, int>(iter_m1->first, iter_m1->second));
iter_m1++;
} else {
res.insert(pair<int, int>(iter_m1->first, iter_m1->second+iter_m2->second));
iter_m1++;
iter_m2++;
}
}
while (iter_m1 != m1.end()) {
res.insert(pair<int, int>(iter_m1->first, iter_m1->second));
iter_m1++;
}
while (iter_m2 != m2.end()) {
res.insert(pair<int, int>(iter_m2->first, iter_m2->second));
iter_m2++;
}
return res;
}
int main() {
int m, n;
int i;
int x, y;
map<int, int> m1;
map<int, int> m2;
map<int, int> res;
map<int, int>::reverse_iterator iter;
vector<int> v;
scanf("%d", &m);
for (i = 0; i < m; i++) {
scanf("%d%d", &x, &y);
m1.insert(pair<int, int>(y, x));
}
scanf("%d", &n);
for (i = 0; i < n; i++) {
scanf("%d%d", &x, &y);
m2.insert(pair<int, int>(y, x));
}
res = add(m1, m, m2, n);
for(iter = res.rbegin(); iter != res.rend(); iter++) {
if (iter->second != 0) {
v.push_back(iter->second);
v.push_back(iter->first);
}
}
for (i = 0; i < v.size(); i++) {
if (i == v.size()) {
cout << v[i] << endl;
} else {
cout << v[i] << " ";
}
}
return 0;
}