题目大意是两个多项式相加,并将结果输出。
输入格式:每行为一个多项式,第一个数字为多项式项数,后面每两个数为一个项,第一个数为指数(也就是数学中X右上角那玩意),第二个数是系数。题目保证不会有系数为0的项,但是会有指数为0的项,也就是常数项。
输出格式:先输出结果的项数,然后按指数从小到大输出每一项(输出项的时候,先输出指数,在输出系数)
输出这有一个坑,系数需要保留小数点后一位。这道题系数都是浮点数,而指数都是整数。
题目比较简单,可以用链表或者数组保存多项式,然后按指数由大到小排序,最后逐项相加(指数相等就直接相加,当然如果相加导致系数为0则不能加入到结果中,不等则将指数较大的一项加入到结果,)。
#include <iostream>
#include <list>
#include <algorithm>
#include <cstdio>
using namespace std;
class item{
public:
double a; //系数
int n; //指数
item(double aa=0, int nn = 0):a(aa), n(nn){}
bool operator <(item& rhs){
return n > rhs.n;
}
};
list<item> l1,l2;
int main(){
int k;
double a;
int n;
cin >> k;
while(k--){
cin >> n >> a;
l1.push_back({a,n});
}
l1.sort(); //读入第一个多项式并排序
cin >> k;
while(k--){
cin >> n >> a;
l2.push_back({a,n});
}
l2.sort(); //读入另一个多项式并排序
//遍历两个链表,这里我将l1作为结果
auto it1=l1.begin(), it2 = l2.begin();
for(;it1 != l1.end() && it2 != l2.end();){
if(it1->n == it2->n){
it1->a += it2->a;
if(it1->a == 0) it1 = l1.erase(it1);
//系数为0,必须删除掉
//erase的返回值是要删除的迭代器后一个迭代器
else ++it1;
++it2;
}
else if(it1->n > it2->n)
++it1;
else {
l1.insert(it1,*it2);
++it2;
}
}
//如果l2还没遍历完说明l2后面的元素指数都小于l1最小的指数,直接加入到l1后面即可
if(it2 != l2.end()){
while(it2 != l2.end()) l1.push_back(*it2++);
}
cout << l1.size();
for(auto &it:l1){
cout << ' ' << it.n << ' ';
printf("%.1f",it.a); //指数要求保留一位小数
}
return 0;
}