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
这是一道中等题目,目的是求多项式A和B的和,因为Ni<=1000,所以其实可以用一个a[1001]数组保存多项式的系数,下标表示多项式的指数,这样表示算法加法会比较简单,但是只能满足Ni<=1000,虽然测试是可以通过,但是这样写感觉特别不爽,最后笔者还是vector<Term>保存一个多项式,Term表示多项式的一项,这样无论是N为任意值都是可以运行的,最后代码如下。代码中isend_a和isend_b分别表示多项式A和B的结束标签,当遍历到最后一位时,即i=a.size时,标签isend_a赋值为true,同理isend_b
#include<vector>
#include<iostream>
#include <iomanip>
using namespace std;
typedef struct term{
int exponent;
double coefficient;
}Term;
vector<Term> addTerm( vector<Term>& a , vector<Term>& b ){
int i,j;//i为a下标,j为b下标
vector<Term> sum;
Term temp;
bool isend_a = false ,isend_b = false ;
for ( i = 0 , j = 0 ; !(isend_a && isend_b) ; ){
if ( !isend_a && !isend_b && a[i].exponent == b[j].exponent ){
temp.exponent = a[i].exponent;
temp.coefficient = a[i].coefficient + b[j].coefficient;
if ( temp.coefficient != 0 )
sum.push_back(temp);
i++;j++;
}
else if( !isend_a && !isend_b && a[i].exponent > b[j].exponent ){
temp = a[i];
sum.push_back(temp);
i++;
}else if( !isend_a && !isend_b && a[i].exponent < b[j].exponent ){
temp = b[j];
sum.push_back(temp);
j++;
}
//--------------------------------
if ( i == a.size() ){
isend_a = true;
i = -1;
}
if ( j == b.size() ){
isend_b = true;
j = -1;
}
//--------------------------------
if ( isend_a && isend_b ){
//a和b都遍历到了最后一个就结束循环
}else if ( isend_a && !isend_b ){
temp = b[j];
sum.push_back(temp);
j++;
}else if ( !isend_a && isend_b ){
temp = a[i];
sum.push_back(temp);
i++;
}
}
return sum;
}
int main(){
int num,i;
vector<Term> a,b,c;
Term temp;
cin>>num;
for ( i = 0 ; i < num ; i++ ){
cin>>temp.exponent>>temp.coefficient;
a.push_back(temp);
}
cin>>num;
for ( i = 0 ; i < num ; i++ ){
cin>>temp.exponent>>temp.coefficient;
b.push_back(temp);
}
c = addTerm( a , b );
//-----------------------显示结果-------------------------
cout<<c.size();
for ( i = 0 ; i < c.size() ; i++ ){
cout<<fixed<<setprecision(1);
cout<<" "<<c[i].exponent<<" "<<c[i].coefficient;
}
return 0;
}