设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
#include<iostream>
#include <list>
#include <utility>
#include <map>
using namespace std;
//多项式乘积
list<pair<int, int>> multi(const list<pair<int, int>> &l1, const list<pair<int, int>> &l2);
//多项式和
list<pair<int, int>> add(const list<pair<int, int>> &l1, const list<pair<int, int>> &l2);
//打印函数
void print(const list<pair<int, int>> &l1);
int main()
{
//输入两行
int len1, len2;
cin >> len1;
list<pair<int, int>> l1, l2, l3; //两个列表接收两个多项式的输入, l3接收运算的返回值
while(len1--){
int coe, exp; //系数,指数
cin >> coe >> exp;
l1.push_back(make_pair(coe, exp));
}
cin >> len2;
while(len2--){
int coe, exp;
cin >> coe >> exp;
l2.push_back(make_pair(coe, exp));
}
//运算多项式乘积
l3 = multi(l1, l2);
print(l3);
cout << endl;
//运算多项式和
l3 = add(l1, l2);
print(l3);
return 0;
}
//多项式乘积
list<pair<int, int>> multi(const list<pair<int, int>> &l1, const list<pair<int, int>> &l2)
{
list<pair<int, int>> ret;
map<int, int> dic;
for(auto p1 : l1){
for(auto p2 : l2){
int coe = p1.first * p2.first;
int exp = p1.second + p2.second;
if(coe == 0) continue;
if(dic.find(exp) != dic.end()){
dic[exp] += coe;
if(dic[exp] == 0)
dic.erase(exp);
}
else{
dic[exp] = coe;
}
}
}
for(auto it = dic.rbegin(); it != dic.rend(); ++it){
ret.push_back(make_pair((*it).second, (*it).first));
}
return ret;
}
//多项式和
list<pair<int, int>> add(const list<pair<int, int>> &l1, const list<pair<int, int>> &l2)
{
list<pair<int, int>> ret;
auto it_l1 = l1.begin();
auto it_l2 = l2.begin();
while(it_l1 != l1.end() && it_l2 != l2.end()){
int exp1 = (*it_l1).second, exp2 = (*it_l2).second;
if(exp1 == exp2){
int coe = (*it_l1).first + (*it_l2).first;
if(coe != 0)
ret.push_back(make_pair(coe, exp1));
++it_l1;
++it_l2;
}else if(exp1 > exp2){
if((*it_l1).first != 0)
ret.push_back(make_pair((*it_l1).first, exp1));
++it_l1;
}else{
if((*it_l2).first != 0)
ret.push_back(make_pair((*it_l2).first, exp2));
++it_l2;
}
}
while(it_l1 != l1.end()){
if((*it_l1).first != 0)
ret.push_back(make_pair((*it_l1).first, (*it_l1).second));
++it_l1;
}
while(it_l2 != l2.end()){
if((*it_l2).first != 0)
ret.push_back(make_pair((*it_l2).first, (*it_l2).second));
++it_l2;
}
return ret;
}
//打印函数
void print(const list<pair<int, int>> &l1){
int len = l1.size();
//如果list里没有结果就打印0 0
if(len == 0) {
cout << "0 0";
return;
}
for(auto p1 : l1){
cout << p1.first << " " << p1.second;
if(--len){
cout << " ";
}
}
}