This time, you are supposed to find A×B where A and B are two polynomials.
Input Specification:
Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:
K N1 aN1 N2 aN2 … NK aNK
where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1,2,⋯,K) are the exponents and coefficients, respectively. It is given that 1≤K≤10, 0≤NK<⋯<N2<N1≤1000.
Output Specification:
For each test case you should output the product of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate up to 1 decimal place.
Sample Input:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample Output:
3 3 3.6 2 6.0 1 1.6
思路:
多项式相乘求系数,由于K<=10,故直接双重循环,用map来保存项与系数的关系,最后从大到小输出就可
注意:
- 系数为0的项不打印,也不算结果的K,故要在输出之前就把result中的系数为0的项移除
- 把空格放在前面,就不用在最后判断了
代码:(C++)
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<int,double> a;
map<int,double> b;
map<int,double, greater<int> > result;
int n;
cin>>n;
int x;
double y;
for(int i=0; i<n; i++)
{
cin>>x>>y;
a[x] = y;
}
cin>>n;
for(int i=0; i<n; i++)
{
cin>>x>>y;
b[x] = y;
}
for(map<int,double>::iterator ita=a.begin(); ita!=a.end(); ita++)
{
for(map<int,double>::iterator itb=b.begin(); itb!=b.end(); itb++)
{
x = ita->first + itb->first;
result[x] += ita->second * itb->second;
if(result[x] == 0) //剔除系数为0的项
result.erase(x);
}
}
cout<<result.size();
for(map<int,double>::iterator itr=result.begin(); itr!=result.end(); itr++)
{
printf(" %d %.1f",itr->first,itr->second); //把空格放前面,避免最后判断末尾空格
}
return 0;
}