设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
这道题算是数据结构线性表的经典联系题了,难度不大,但是我在第二条卡了一会,最后发现在加的时候考虑了系数为0的情况但是在乘的时候却漏掉了,好在最后发现并解决了,其实可以更精简一点的
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
// 多项式的每一项结构体
struct node {
int xishu; // 系数
int zhishu; // 指数
};
// 自定义排序规则,按照指数降序排列
bool cmp(node a, node b)
{
return a.zhishu > b.zhishu;
}
// 计算两个多项式的乘积
vector<node> cheng(vector<node>& a, vector<node>& b)
{
vector<node> st;
node temp;
// 遍历第一个多项式的每一项
for (int i = 0; i < a.size(); i++)
{
// 遍历第二个多项式的每一项
for (int j = 0; j < b.size(); j++)
{
// 计算乘积项的系数和指数
temp.xishu = a[i].xishu * b[j].xishu;
temp.zhishu = a[i].zhishu + b[j].zhishu;
st.push_back(temp); // 将乘积项添加到结果中
}
}
sort(st.begin(), st.end(), cmp); // 按照指数降序排序
// 合并同类项
for (int i = 1; i < st.size(); i++)
{
if (st[i - 1].zhishu == st[i].zhishu)
{
st[i].xishu += st[i - 1].xishu;
st.erase(st.begin() + i - 1);
i--;
}
}
// 删除系数为零的项
st.erase(remove_if(st.begin(), st.end(), [](const node& n) { return n.xishu == 0; }), st.end());
return st;
}
// 计算两个多项式的和
vector<node> jia(vector<node> a, vector<node> b)
{
vector<node> st;
node temp;
int i = 0;
int j = 0;
// 按照指数合并两个多项式的项
while (i < a.size() && j < b.size())
{
if (a[i].zhishu == b[j].zhishu) // 如果指数相等
{
temp.xishu = a[i].xishu + b[j].xishu; // 系数相加
temp.zhishu = a[i].zhishu; // 指数不变
if (temp.xishu != 0) // 如果系数不为零
{
st.push_back(temp); // 添加到结果中
}
++i;
++j;
}
else if (a[i].zhishu > b[j].zhishu) // 第一个多项式指数较大
{
st.push_back(a[i]); // 直接添加到结果中
++i;
}
else // 第二个多项式指数较大
{
st.push_back(b[j]); // 直接添加到结果中
++j;
}
}
// 将剩余的项添加到结果中
while (i < a.size())
{
st.push_back(a[i]);
++i;
}
while (j < b.size())
{
st.push_back(b[j]);
++j;
}
// 删除系数为零的项
st.erase(remove_if(st.begin(), st.end(), [](const node& n) { return n.xishu == 0; }), st.end());
return st;
}
// 打印多项式
void print(vector<node> ans)
{
if (ans.size() == 0)
{
cout << "0 0";
}
else
{
for (int i = 0; i < ans.size(); i++)
{
cout << ans[i].xishu << " " << ans[i].zhishu;
if (i != ans.size() - 1)
{
cout << " ";
}
}
}
}
int main()
{
int n1, n2;
cin >> n1;
vector<node> pol1(n1);
// 输入第一个多项式的每一项
for (int i = 0; i < n1; i++)
{
cin >> pol1[i].xishu >> pol1[i].zhishu;
}
cin >> n2;
vector<node> pol2(n2);
// 输入第二个多项式的每一项
for (int i = 0; i < n2; i++)
{
cin >> pol2[i].xishu >> pol2[i].zhishu;
}
// 计算并输出乘积多项式
vector<node> product = cheng(pol1, pol2);
print(product);
cout << endl;
// 计算并输出和多项式
vector<node> sum = jia(pol1, pol2);
print(sum);
return 0;
}