写文章式复习法真是有奇效,算是初步摆脱了做过的题不回头看的陋习。刚写完甲题1010,余兴未了,顺便在此处反思总结一下甲题1009。
题目大意:
输入:
以此格式输入两个多项式A和B:
K N1 aN1 N2 aN2 … NK aNK(分别用两行输入)
K为多项式非0项的个数,Ni为第i项指数,aNi为第I项系数。此处:1≤K≤10, 0≤NK<⋯<N2<N1≤1000.
输出:
计算多项式A*B的结果,以同样格式输出,行末不能有多余空格,系数精确到小数点后一位。
思路:
为了提高算法效率,个人觉得没有必要将两个多项式均存储起来进行遍历计算。只需将第一个多项式存储,在第二个多项式输入进来时进行及时计算即可。作者采用了map进行存储,以指数作为关键字(first),以系数作为值(second)。
坑点解析:
要特别注意计算出来系数为0的项,无论是统计多项式项数,亦或者是输出的时候
代码:
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<int, double> mp; //存放第一个多项式
map<int, double, greater<int>> mpout; //存放用于输出的多项式
int ex, K; //ex是指数
double co; //co是系数
cin >> K;
for (int i = 0; i < K; i++)
{
cin >> ex >> co;
mp[ex] = co; //将第一个多项式按指数为关键字存入mp
}
map<int, double>::iterator it; //用迭代器遍历map
cin >> K;
for (int i = 0; i < K; i++)
{
cin >> ex >> co;
for (it = mp.begin(); it != mp.end(); it++) //第二个多项式每输入一项,遍历一遍mp,进行计算
{
mpout[it->first + ex] += it->second*co;
if (mpout[it->first + ex] == 0) //系数为0项剔除
mpout.erase(it->first);
}
}
int size = mpout.size();
if (size != 0)
printf("%d ", size); //这边建议用printf,因为不建议printf和cout同时使用
for (it = mpout.begin(); it != mpout.end(); it++)
(--size) != 0 ? printf("%d %.1f ", it->first, it->second) : printf("%d %.1f", it->first, it->second); //最后一次不输出空格
return 0;
}
这就是作者的代码实现,若有不足之处欢迎大家批评指正!