PAT(Advanced Level) 1002 A+B

这个题都没一次通过,可以说很丢人了……

不过细说起来,还是有值得聊聊的地方。

先看题目: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值才是小数点后的位数。这也正是我们需要的结果。

点赞