设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0
。
#include <iostream>
#include <vector>
#include <algorithm>
#include <list>
using namespace std;
class MyCompare
{
public:
bool operator()(pair<int, int> p1, pair<int, int> p2)
{
if (p1.first > p2.first)
{
return true;
}
else
{
return false;
}
}
};
int main()
{
vector<pair<int, int>> v1;
vector<pair<int, int>> v2;
vector<pair<int, int>> v3;// 和
vector<pair<int, int>> v4;// 积
int number_of_terms = 0;
scanf("%d", &number_of_terms);
while (number_of_terms != 0)
{
int coefficient = 0;
int index = 0;
scanf("%d", &coefficient);
scanf("%d", &index);
number_of_terms--;
v1.push_back(pair<int, int>(index, coefficient));
}
scanf("%d", &number_of_terms);
while (number_of_terms != 0)
{
int coefficient = 0;
int index = 0;
scanf("%d", &coefficient);
scanf("%d", &index);
number_of_terms--;
v2.push_back(pair<int, int>(index, coefficient));
}
// 求积
for (int i = 0; i < v1.size(); i++)
{
for (int j = 0; j < v2.size(); j++)
{
v4.push_back(pair<int, int>(v1[i].first+v2[j].first, v1[i].second*v2[j].second));
}
}
sort(v4.begin(), v4.end(), MyCompare());
list<pair<int, int>> tmp(v4.begin(), v4.end());
auto cur = tmp.begin();
cur++;
auto prev = tmp.begin();
while (cur != tmp.end())
{
if (cur->first == prev->first)
{
prev->second = prev->second + cur->second;
cur = tmp.erase(cur);
}
else
{
prev++;
cur++;
}
}
cur = tmp.begin();
while(cur != tmp.end())
{
if (cur->second == 0)
{
cur = tmp.erase(cur);
}
else{
cur++;
}
}
if (tmp.empty())
{
tmp.push_back(pair<int,int>(0,0));
}
cur = tmp.begin();
int y = 0;
int size = tmp.size();
while (cur != tmp.end())
{
if (y != size - 1)
{
cout << cur->second << ' ' << cur->first << ' ';
cur++;
y++;
}
else
{
cout << cur->second << ' ' << cur->first;
cout << endl;
cur++;
y++;
}
}
// 求和
int i = 0;
int j = 0;
while (i < v1.size() && j < v2.size())
{
if (v1[i].first > v2[j].first)
{
v3.push_back(v1[i]);
i++;
}
else if (v1[i].first < v2[j].first)
{
v3.push_back(v2[j]);
j++;
}
else
{
v3.push_back(pair<int, int>(v1[i].first, v1[i].second + v2[j].second));
i++;
j++;
}
}
if (i == v1.size())
{
while (j < v2.size())
{
v3.push_back(v2[j]);
j++;
}
}
if (j == v2.size())
{
while (i < v1.size())
{
v3.push_back(v1[i]);
i++;
}
}
list<pair<int, int>> tmp2(v3.begin(), v3.end());
auto cur2 = tmp2.begin();
while(cur2 != tmp2.end())
{
if (cur2->second == 0)
{
cur2 = tmp2.erase(cur2);
}
else{
cur2++;
}
}
if (tmp2.empty())
{
tmp2.push_back(pair<int,int>(0,0));
}
cur2 = tmp2.begin();
y = 0;
size = tmp2.size();
while (cur2 != tmp2.end())
{
if (y != size - 1)
{
cout << cur2->second << ' ' << cur2->first << ' ';
cur2++;
y++;
}
else
{
cout << cur2->second << ' ' << cur2->first;
cur2++;
y++;
}
}
return 0;
}