多项式相加
作者:互联网
问题
1002 A+B for Polynomials (25 分)
This time, you are supposed to find A+B where A and B are two polynomials.
Input Specification:
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:
K N
1
a
N
1
N
2
a
N
2
… N
K
a
N
K
where K is the number of nonzero terms in the polynomial, N
i
and a
N
i
(i=1,2,⋯,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10,0≤N
K
<⋯<N
2
<N
1
≤1000.
Output Specification:
For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.
Sample Input:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
结尾无空行
Sample Output:
3 2 1.5 1 2.9 0 3.2
结尾无空行
思路
利用map<int,double,greater>按key可以从大到小自动排序的特性来存储多项式相加后的结果。第一遍先让第一个多项式放进map中,第二遍对于第二个多项式,如果key已存在,则让系数相加即可,如果key不存在,新增一对key value。最后利用迭代器输出map即可。
代码
#include <bits/stdc++.h>
using namespace std;
map<int,double,greater<int>> mp;
int n,m;
int main(){
int iNum;
double fNum;
cin>>n;
for (int i = 0; i < n; ++i) {
getchar();
scanf("%d %lf",&iNum,&fNum);
mp[iNum] = fNum;
}
cin>>m;
for (int j = 0; j < m; ++j) {
getchar();
scanf("%d %lf",&iNum,&fNum);
if(mp.count(iNum)!=0){
mp[iNum] = mp[iNum] + fNum;
if(mp[iNum] == 0){
mp.erase(iNum);
}
}
else
mp[iNum] = fNum;
}
map<int,double>::iterator it;
--it;
cout<<mp.size();
if(mp.size()!=0)
cout<<" ";
int count = 0;
for (it = mp.begin();it!=mp.end();++it) {
++count;
printf("%d %.1f",it->first,it->second);
if(count != mp.size())
cout<<" ";
}
cout<<endl;
return 0;
}
总结
几个坑要注意:
1.系数的结果要保留一位小数。
2.两个系数相加可能等于0,这时要删除key。
3.对于结果多项式,如果为0,只需要输出一个0即可,后面不能接空格,注意边界情况的输出格式,否则会一直卡在23分。
标签:map,int,多项式,相加,mp,key,iNum,fNum 来源: https://blog.csdn.net/qq_19272233/article/details/119300580