今日随笔–PAT (Advanced Level) Practice 1002@TOC
1002 A+B for Polynomials (25分)
花了点时间改进代码,其实用map很合适。
复习了map容器相关知识点
题意
看英文题目很不习惯,但是也没那么难懂。学习一些新单词:
polynomial–多项式
exponent-- 指数/幂
coefficient–系数
就是识别输入,然后对应项相加,精确到小数点后一位,诶,对了,提醒了我
double类型的数,printf("%.1lf",num)
不是%d是%lf
loat的话是printf("%.2f", f)
易错点:
1.直接用数组很简单,但是很不好(个人觉得),数组的利用率到不了1/100
2. 是降序输出的,map默认升序排序,倒着输出就行了
3. 系数可能为负,系数为0则不显示这项,要遍历删除系数为0的项
4. 特殊的,当没有系数不为0的项,如何显示。
#include<bits/stdc++.h>
#include<sstream>
#include <stdlib.h>
using namespace std;
int main(){
double duo1[21];
double duo2[21];
int aaa=0;
double temp;
while(cin>>temp){
duo1[aaa++]=temp;
if(cin.get() =='\n') break;
}
aaa=0;
while(cin>>temp){
duo2[aaa++]=temp;
if(cin.get() =='\n') break;
}
map<int,double>d1,d2;
int num1=duo1[0]*2,num2=duo2[0]*2;
for(int i=1;i<=num1;i++){
d1[duo1[i]]=duo1[++i];
}
for(int i=1;i<=num2;i++){
d2[duo2[i]]=duo2[++i];
}
map<int,double>::iterator it=d2.begin();
for(;it!=d2.end();it++){
d1[it->first]=d1[it->first]+d2[it->first];
}
map<int,double>::iterator itt=d1.begin();
for(;itt!=d1.end();){
if(itt->second==0) d1.erase(itt++);
else itt++;
}
if(d1.size())cout<<d1.size()<<" ";
else {
cout<<"0";return 0;
}
itt=d1.end();
itt--;
for(;itt!=d1.begin();itt--){
if(d1[itt->first]==0) continue;
cout<<itt->first<<' ';
printf("%.1lf ",d1[itt->first]);
} if(d1[itt->first]!=0){
cout<<itt->first<<' ';
printf("%.1lf",d1[itt->first]);
}
return 0;
}