实现思路
实现的是多项式的加法,也就是对应位开始相加;
一、为方便统一化处理,将读取多样式位数及系数存储到pair这一数据结构中,所有的pair是存储到vector数组中,为方便下一步的操作,将得到的所有数据按照位降序排列。
二、利用到了归并排序的思想,同时遍历两个vector,当两个vector数组系数一样大时相加存储到结果vector中,如果一方较大,那就先存储较大的到结果数组中,该方遍历数据往下移动
三、这样处理完之后还剩余数据的一方依次将结果存入
注意: 题目中要求数据是保留一位小数的,有个取巧的方法就是当有位计算后的数值是小于0.1就说明该数据被截取后的系数为0,题目的陷阱就在此,系数为0的项不输出结果
实现代码
#include <iostream>
#include <cstdio>
#include <utility>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
bool ccmp1(const pair<int,double> a,const pair<int,double>b){
return a.first>b.first;
}
void get_data(int n1,vector<pair<int,double>> &ss){
for(int i=0;i<n1;i++){
int x1;
double x2;
cin>>x1>>x2;
ss.push_back(make_pair(x1,x2));
}
sort(ss.begin(),ss.end(),ccmp1);
}
int main(){
int n1,n2;
vector<pair<int,double>>a,b;
cin>>n1;
get_data(n1,a);
cin>>n2;
get_data(n2,b);
int i=0,j=0;
vector<pair<int,double>> re;
while(i<a.size()&&j<b.size()){
if(a[i].first==b[j].first){
int x1=a[i].first;
double x2=a[i].second+b[j].second;
if(x2>0.01)
{
re.push_back(make_pair(x1,x2));}
i++;
j++;
}
else if(a[i].first>b[j].first){
re.push_back(a[i]);
i++;
}
else {
re.push_back(b[j]);
j++;
}
}
while(i<a.size()){
re.push_back(a[i]);
i++;
}
while(j<b.size()){
re.push_back(b[j]);
j++;
}
cout<<re.size();
for(int i=0;i<re.size();i++){
printf(" %d %.1f",re[i].first,re[i].second);
}
}
需要掌握输出小数保留为1位
(一)c语言写法:
printf("%.1f",x);
(二)c++写法
#include < iomanip >
cout<<fixed<<setprecision(1)<<x;
提交结果及分析
时间复杂度O(n)