This time, you are supposed to find?A+B?where?A?and?B?are two polynomials.
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 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.
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
题意分析:?
题目的意思很简单,有A和B两个多项式,我们要将它们相加,即合并同类项
对于给的测试样例:A=2.4x+3.2? ? ? ? B=1.5x^2+0.5x? ? ? ? 所以C=A+B=1.5x^2+2.9x+3.2
我们可以将多项式中的每一个项表示为一个结构体Term,包含指数exp和系数coe两个属性
题目中的项是按照指数递减的顺序排列的,且不会重复,所以将两个多项式的项同时开始遍历,取指数大的那个项先放入C中,如果指数相同,则系数相加再放入C中
注意!!!测试点345是针对系数相加为0的情况,0的话就不用放入C了;测试点6是针对A+B=0的情况,单独处理,直接输出0!!!
害,都是血泪教训。。。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
struct Term
{
int exp;
double coe;
};
int main()
{
vector<Term> C;
int kA;
scanf("%d",&kA);
vector<Term> A;
for(int i=0;i<kA;i++)
{
Term a;
int exp;
double coe;
scanf("%d",&exp);
scanf("%lf",&coe);
a.exp=exp;
a.coe=coe;
A.push_back(a);
}
int kB;
scanf("%d",&kB);
vector<Term> B;
for(int i=0;i<kB;i++)
{
Term b;
int exp;
double coe;
scanf("%d",&exp);
scanf("%lf",&coe);
b.exp=exp;
b.coe=coe;
B.push_back(b);
}
int i=0,j=0;
while(i<kA||j<kB){
if(A[i].exp>B[j].exp)
{
C.push_back(A[i]);
i++;
}
else if(A[i].exp<B[j].exp)
{
C.push_back(B[j]);
j++;
}
else if(A[i].exp==B[j].exp)
{
Term temp;
temp.exp=A[i].exp;
temp.coe=A[i].coe+B[j].coe;
if(temp.coe!=0){//系数和为0则删去
C.push_back(temp);
}
i++;
j++;
}
}
while(i<kA)
{
C.push_back(A[i]);
i++;
}
while(j<kB)
{
C.push_back(B[j]);
j++;
}
int size=C.size();
//A+B=0的情况单独处理,不然会有段错误
if(size==0)printf("%d",0);
else{
printf("%d ",size);
printf("%d %.1lf",C[0].exp,C[0].coe);
for(int i=1;i<C.size();i++)
{
printf(" %d %.1lf",C[i].exp,C[i].coe);
}
}
printf("\n");
return 0;
}
运行结果如下:
(我不理解的是,在判断语句 while( i < kA || j < kB ) 中,我一开始写的是while( i != kA || j !=kB ),这样就会报段错误,我也想不通为什么,找了很久错误,甚至以为是vector的某种原因,最后改成现在这样就ok了,希望有大佬可以评论区解释一下~~)
|