题目描述
英文
中文大意
计算两个A、B
多项式的和
输入
每个样例包含两行, K
N1 aN1 N2 aN2 … NK aNK
K
是多项式中非零项的个数, Ni aNi 是指数和系数
其中K
的范围在 [1, 10] 指数和系数的的范围在 [0, 1000]
输出
对于每个输出样例, A、B
的和都应该占据一行。
需要注意的是不允许在每行末尾添加额外的空格
请精确到小数点后一位
思路分析
比较常规的写法是用两个数组存储然后 指数存放在下标, 系数存放在值。
而且完全可以精简到一个数组, 但是要空间换时间, 个人感觉挺浪费
于是用了map库中的map
参考了网上的博客, 利用类似于哈希表的数据结构
需要注意的点:
- 最后是输出系数非零的项, 需要对
double
类型进行 零值判断 精度检测 - 开始输出之前要先输出非零项的个数, 一开始我直接
map.size()
疯狂报错 - 输出格式 精确到1位小数
- 代码优化点——可以在给map赋值的时候, 直接把 0 项移除,这样就不会在下面多遍历一边来求非0项的个数了
code
#include <iostream>
#include <iomanip>
#include <map>
#include <math.h>
using namespace std;
/**
* 判断一个double类型的浮点数是否为 0
* @return
*/
bool isDoubleZero(double n) {
if (fabs(n) < 1e-15) {
return true;
}
return false;
}
map<int, double> poly;
int main() {
int num, index;
double coefficient;
// 数据输入
for(int i = 0;i < 2;i++) {
cin >> num;
for(int j = 0;j < num;j++) {
cin >> index >> coefficient;
// 首次出现
if (poly.count(index) == 0)
poly[index] = coefficient;
else
poly[index] += coefficient;
}
}
// 构建迭代器
// map中的元素是自动按Key升序排序 所以使用 反向迭代器
// map<int, double>::iterator iter;
map<int, double>::reverse_iterator iter;
int cnt = 0;
for(iter = poly.rbegin();iter != poly.rend();iter++) {
if (!isDoubleZero(iter->second)) cnt++;
}
cout << cnt;
// 处理特情
if (cnt == 0) return 0;
// 遍历迭代器
for(iter = poly.rbegin();iter != poly.rend();iter++) {
// 判断系数是否为0——由于系数是double 需要判断精度
if (!isDoubleZero(iter->second))
printf(" %d %.1lf", iter->first, iter->second);
// cout << ' ' << iter->first << ' ' << setiosflags(ios::fixed) << setprecision(1) << iter->second;
}
return 0;
}
题目链接
1002 A+B for Polynomials (25分)