设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
难点在于要求幂的降序形式输出,这样就必须用键值对,将幂排序后再输出。
知识点:
map
的第一个模板参数是键类型,第二个模板参数是值类型。greater<int>
是一个仿函数,用于定义 map
的排序方式,它作用于第一个模板参数上,也就是对键进行排序。
在本题中,我们希望将多项式按照指数降序排列,而指数是 map
的键,因此需要使用 greater<int>
对键进行排序,而不是值。
#include <functional> // greater 的头文件
step1:
int n, coef, exp;
map<int, int, greater<int>> poly1, poly2; // 系数-指数对,使用降序的指数
cin >> n;
while (n--) {
cin >> coef >> exp;
poly1[exp] = coef; // 指数是键,系数是值,产生了键值对。这里greater<int>表示按照键递减排序。
}
cin >> n;
while (n--) {
cin >> coef >> exp;
poly2[exp] = coef;
}
poly[exp] = coef 表示指数是键,系数是值。
step2:
使用新的map来存数结果多项式,product[exp] += coef 表示指数相同的话,系数就相加,也就是称完之后合并同类项
而sum在处理过程中,直接就是合并操作
// 计算多项式乘积
map<int, int, greater<int>> product; // 乘积多项式
for (auto it1 = poly1.begin(); it1 != poly1.end(); it1++) {
for (auto it2 = poly2.begin(); it2 != poly2.end(); it2++) {
int exp = it1->first + it2->first; // 乘积多项式的指数
int coef = it1->second * it2->second; // 乘积多项式的系数
product[exp] += coef; // 相同指数的项系数相加
}
}
// 计算多项式和
map<int, int, greater<int>> sum; // 和多项式
for (auto it = poly1.begin(); it != poly1.end(); it++) {
sum[it->first] += it->second;
}
for (auto it = poly2.begin(); it != poly2.end(); it++) {
sum[it->first] += it->second;
}
step3:输出
难点:要求最后一个不带空格,我想到了从0到倒数第二个都带空格,最后一个单独处理,但是product.end() - 1不行。
chat给出的解法是第一个单独处理,后面所有的输出都在前面加上空格。
// 输出多项式乘积
if (product.empty()) {
cout << "0 0" << endl;
} else {
bool isFirst = true;
for (auto it = product.begin(); it != product.end(); it++) {
if (it->second != 0) {
if (isFirst) {
cout << it->second << " " << it->first;
isFirst = false;
} else {
cout << " " << it->second << " " << it->first;
}
}
}
cout << endl;
}
// 输出多项式和
if (sum.empty()) {
cout << "0 0" << endl;
} else {
bool isFirst = true;
for (auto it = sum.begin(); it != sum.end(); it++) {
if (it->second != 0) {
if (isFirst) {
cout << it->second << " " << it->first;
isFirst = false;
} else {
cout << " " << it->second << " " << it->first;
}
}
}
cout << endl;
}
总结:难点在于使用map键值对去将指数和系数关联。只有这样才能用降序表示最终结果。