求两个一元多项式的和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分1行,分别以指数递降方式输出和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例1:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例1:
5 20 -4 4 -5 2 9 1 -2 0
代码:
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int a,b,x,y;
map<int,int> m;
set<int> s; //set可以方便地对指数进行排序
cin>>a; //输入第一行数据
for(int i=0; i<a; i++)
{
cin>>x>>y;
m[y]=x;
s.insert(y);
}
cin>>b; //输入第二行数据时将指数相同的系数相加
for(int i=0; i<b; i++)
{
cin>>x>>y;
if(m[y]!=0)
{
m[y]+=x;
}
else
{
m[y]=x;
s.insert(y);
}
}
int p[s.size()],num=0,sum=0; //由于set只能从小到大排序,所以定义一个数组
for(auto it=s.begin(); it!=s.end(); it++)
{
sum+=m[*it];//当所有的系数都为0时也是零多项式,用sum来考虑这种情况
p[num++]=*it;
}
sort(p,p+num,cmp);
if((a==0&&b==0)||sum==0)//题目要求输入非零项系数,所以两行都不输入以及sum=0时为零多项式
{
cout<<"0 0"<<endl;
}
else
{
int flag=0;
for(int i=0; i<num; i++)
{
if(m[p[i]]!=0)
{
if(flag==0)
{
cout<<m[p[i]]<<" "<<p[i];
flag=1;
}
else
cout<<" "<<m[p[i]]<<" "<<p[i];
}
}
}
return 0;
}