1. 题目
2. 分析
题意:测试案例给出两行,每行代表一个多项式,多项式由指数和系数构成,现在要求根据给出的两个多项式,计算两个多项式的乘法结果,结果同样根据所给的格式输出。
3. 解题过程
- 这是一个简单模拟,模拟多项式的乘法,所以我们需要找到一个容器才模拟多项式,于是会想到创建一个map来充当一个多项式,具体就是把每个指数对应一个系数,然后模拟乘法的次序进行相加。
- 整体思路即为创建三个map,两个map用来接收所给的两个多项式,剩下一个作为乘法的结果多项式。
- 请看代码实现:
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<int, double> A;
map<int, double> B;
int a, b; double c;
scanf("%d", &a);
for(int i = 0; i < a; i++)
{
scanf("%d %lf", &b, &c);
A[b] = c;
}
scanf("%d", &a);
for(int i = 0; i < a; i++)
{
scanf("%d %lf", &b, &c);
B[b] = c;
}
map<int, double> ans;
for(auto it = A.begin(); it != A.end(); it++)
{
for(auto it1 = B.begin(); it1 != B.end(); it1++)
{
b = it->first + it1->first;
c = it->second * it1->second;
ans[b] += c;
if(ans[b] == 0) //需要注意若系数为零,则该项需要删除!
{
auto it4 = ans.find(b);
ans.erase(it4);
}
}
}
printf("%d", ans.size());
auto it2 = ans.end(); //因为map有自动排序的功能,所以从后往前输出即为所要的格式输出。
it2 --;
for(int i = 0; i < ans.size(); i++)
{
printf(" %d %.1lf", it2->first, it2->second);
it2--;
}
return 0;
}
4. 小结
- 再一次彰显了map的功能强大,应对此简单模拟显得绰绰有余。
- 重温了map的删除语法:name.erase(it)或者name.erase(it, it+len).
感谢阅读,素质三连。