PAT甲题 1009 Product of Polynomials

PAT甲题 1009 Product of Polynomials


写文章式复习法真是有奇效,算是初步摆脱了做过的题不回头看的陋习。刚写完甲题1010,余兴未了,顺便在此处反思总结一下甲题1009。

题目大意:

输入:
以此格式输入两个多项式A和B:
K N​1​​ a​N​1​​​​ N​2​​ a​N​2​​​​ … N​K​​ a​N​K(分别用两行输入)
K为多项式非0项的个数​​,Ni为第i项指数,aNi为第I项系数。此处:1≤K≤10, 0≤N​K​​<⋯<N​2​​<N​1​​≤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;
}

这就是作者的代码实现,若有不足之处欢迎大家批评指正!
​​

原文地址:https://www.cnblogs.com/yuhan-blog/p/12309121.html