1002. A+B for Polynomials (25)
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 Input2 1 2.4 0 3.2 2 2 1.5 1 0.5Sample Output
3 2 1.5 1 2.9 0 3.2
#include <vector>
#include <iostream>
#include <string>
#include <algorithm>
#include <iomanip>
using namespace std;
bool is_space(char c){
return isspace(c);
}
bool not_space(char c){
return !is_space(c);
}
vector<pair<int,double> > get_content(string str){
vector<pair<int,double> > rnt;
string::const_iterator i=str.begin();
string::const_iterator j;
i=find_if(i,str.end(),not_space);
j=find_if(i,str.end(),is_space);
int num=atoi(string(i,j).c_str());
int exp;
double coe;
i=j;
while(i!=str.end()){
i=find_if(i,str.end(),not_space);
j=find_if(i,str.end(),is_space);
if(i!=str.end())
exp=atoi(string(i,j).c_str());
i=find_if(j,str.end(),not_space);
j=find_if(i,str.end(),is_space);
if(i!=str.end())
coe=atof(string(i,j).c_str());
if(coe!=0)
rnt.push_back(make_pair(exp,coe));
i=j;
}
return rnt;
}
int main(){
string str;
getline(cin,str);
vector<pair<int,double> > cot1=get_content(str);
getline(cin,str);
vector<pair<int,double> > cot2=get_content(str);
vector<pair<int,double> >::const_iterator i1=cot1.begin();
vector<pair<int,double> >::const_iterator i2=cot2.begin();
vector<pair<int,double> > rvec;
while(i1!=cot1.end() && i2!=cot2.end()){
if(i1->first == i2->first){
if(i1->second+i2->second!=0)
rvec.push_back(make_pair(i1->first,i1->second+i2->second));
++i1;
++i2;
}else if(i1->first > i2->first){
rvec.push_back(*i1);
++i1;
}else{
rvec.push_back(*i2);
++i2;
}
}
while(i1!=cot1.end()){
rvec.push_back(*i1);
++i1;
}
while(i2!=cot2.end()){
rvec.push_back(*i2);
++i2;
}
cout << setprecision (1) << fixed;
cout<<rvec.size();
i1=rvec.begin();
while(i1!=rvec.end()){
cout<<" "<<(*i1).first<<" "<<(*i1).second;
++i1;
}
return 0;
}