题目描述
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.
输出描述:
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
输出例子:
3 2 1.5 1 2.9 0 3.2
题目分析思路
题目的本质要求是实现多项式相加,由于输入顺序是按照指数从高到低,所以降低了题目的难度。选择两个结构体数组来存储输入的指数和系数。然后按照指数从高到低比较两个数组中的指数。指数较高的保存在新的数组中,指数相同时,将系数相加。最后输出数组中系数不为0的项,即可得到正确答案。
代码实现(C++版本)
#include <iostream>
#include <iomanip>
using namespace std;
struct Pair{
int zhishu=0;
double xishu=0;
};
int main()
{
int m;
cin >> m;
Pair a[m];
for(int i =0;i<m;i++){
cin >> a[i].zhishu >> a[i].xishu;
}
int n;
cin >> n;
Pair b[n];
for(int i =0;i<n;i++){
cin >>b[i].zhishu >> b[i].xishu;
}
Pair c[m+n];
int ai = 0,bi =0;
for(int i =0; i< m+n;i++){
if(ai!=m && bi!= n){
int aget = a[ai].zhishu;
int bget = b[bi].zhishu;
if (aget>bget){
c[i].zhishu = a[ai].zhishu;
c[i].xishu = a[ai].xishu;
ai++;
} else if(aget == bget){
c[i].zhishu = a[ai].zhishu;
c[i].xishu = a[ai].xishu + b[bi].xishu;
ai++;
bi++;
} else{
c[i].zhishu = b[bi].zhishu;
c[i].xishu = b[bi].xishu;
bi++;
}
continue;
}else if(ai==m && bi!= n){
c[i].xishu = b[bi].xishu;
c[i].zhishu = b[bi].zhishu;
bi++;
continue;
}else if(bi==n && ai != m) {
c[i].xishu = a[ai].xishu;
c[i].zhishu = a[ai].zhishu;
ai++;
continue;
}else if(ai==m && bi == n){
break;
}
}
int count =0;
for(int i =0 ;i<m+n;i++){
if(c[i].xishu!=0)
count++;
}
cout<<count;
for(int i =0 ;i<m+n;i++){
if(c[i].xishu!=0)
cout<<" "<<c[i].zhishu << " "<<setiosflags(ios::fixed)<<setprecision(1)<<c[i].xishu;
}
return 0;
}