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 Input
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
方法一:
程序设计:
构造一个包含1001个元素的数组,把输入的多项式的指数项当做数组的下标,系数项当做该下标对应元素的值
**注意:系数项求和之后为0的项不显示
C++ 代码如下:
#include <bits/stdc++.h>
using namespace std; int main(){
float num[];
for(int i=;i<;i++){
num[i]=0.0;
}
int m,n,temp1,count=;
float temp2;
cin>>m;
for(int i=;i<m;i++){
cin>>temp1>>temp2;
num[temp1]+=temp2;
}
cin>>n;
for(int i=;i<n;i++){
cin>>temp1>>temp2;
num[temp1]+=temp2;
}
for(int i=;i<;i++){
if(num[i]!=)
count++;
}
cout<<count;
for(int i=;i>=;i--){
if(num[i]!=)
cout<<' '<<i<<' '<<setiosflags(ios::fixed)<<setprecision()<<num[i];
}
system("pause");
}
C++ Code 1
方法二:
程序设计:
使用标准模板库(STL)中的 map 容器
关于 map :map 是用来存放 <key,value> 键值对的数据结构,key 和 value 一一对应,并且在map 中,key是唯一的
1.在map中存入数据时,默认安装key的升序来存放
map<int,float> num; //默认按照key的升序排列存储数据,int,float分别为key和value的数据类型
此题中将多项式的指数项作为key,系数项作为value进行存储,若最后按照key的降序进行打印输出时,可使用逆向迭代器来遍历map中的元素:
map<int,float>::reverse_iterator it; //定义map的逆向迭代器
for(it=num.rbegin();it!=num.rend();it++){
if(it->second!=0)
cout<<' '<<it->first<<' '<<setiosflags(ios::fixed)<<setprecision(1)<<it->second;
}
其中:num.rbegin() :返回指向第一个元素的逆向迭代器
num.rend() :返回指向最后一个元素的逆向迭代器
it->first :表示map中 it 迭代器指向的元素的key值,等同于 (*it).first
it->second:表示map中 it 迭代器指向的元素的value值,等同于 (*it).second
2.将map存入数据时按照key的降序排列
map<int,float,greater<int> > num; //按照key的降序来存储数据
// ^ 注意此处有空格
这时,再打印多项式的指数项和系数项时可使用map的普通的迭代器:
map<int,float>::iterator it; //普通的迭代器
for(it=num.begin();it!=num.end();it++){
if(it->second!=0)
cout<<' '<<it->first<<' '<<setiosflags(ios::fixed)<<setprecision(1)<<it->second;
}
C++ 代码如下:
#include <bits/stdc++.h>
using namespace std; int main(){
map<int,float,greater<int> > num;
int m,exp;
float coef;
for(int i=;i<;i++){
cin>>m;
for(int j=;j<m;j++){
cin>>exp>>coef;
num[exp]+=coef;
}
}
m=;
map<int,float>::iterator it;
for(it=num.begin();it!=num.end();it++){
if(it->second!=)
m++;
}
cout<<m;
for(it=num.begin();it!=num.end();it++){
if(it->second!=)
cout<<' '<<it->first<<' '<<setiosflags(ios::fixed)<<setprecision()<<it->second;
}
system("pause");
}
C++ Code 2