这个题都没一次通过,可以说很丢人了……
不过细说起来,还是有值得聊聊的地方。
先看题目:1002
This time, you are supposed to find A+B where A and B are two polynomials.
Input
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial: K N1 aN1 N2 aN2 … NK aNK, where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1, 2, …, K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10,0 <= NK < … < N2 < N1 <=1000.
Output
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
Sample Output
简单来说,就是多项式加法。
先看代码:
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
map<int, double, greater<int> > poly;
int main(){
int k1=0, k2=0;
cin>>k1;
int e=0;
double c=0;
for(int i=0; i<k1; ++i){
cin>>e>>c;
poly[e]=c;
}
cin>>k2;
for(int i=0; i<k2; ++i){
cin>>e>>c;
if(poly.count(e)==0)
poly[e]=c;
else
poly[e]+=c;
//注意加和后系数可能为0
if(poly[e]==0.0||poly[e]==-0.0){
poly.erase(e);
}
}
cout<<poly.size();
cout.precision(1);//精度控制
for(auto it=poly.begin(); it!=poly.end(); it++){
cout<<fixed<<" "<<it->first<<" "<<it->second;
}
return 0;
}
基本上,要注意的也就两点,都在注释里指出了。
- 相加之后系数和为0的问题
这一点本来是很明显的,而且题目里可以说是有提示,但是因为没有测试数据,而题目本身又很简单,所以当你发现竟然没过的时候会很懵并失去理性……
- 精度控制
用c的话当然很方便,但c++就不同了,这里说一下:
cout.precision(val) 在声明为定点数之前,是表示将一个实数的有效数字设置为val。比如当val为3的时候,会输出2.12,而不是所期待的2.123。(这里2.12 2.123 为随意例举数字)
只有在输出的时候,用cout<<fixed声明要输出定点数,val值才是小数点后的位数。这也正是我们需要的结果。