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 Input2 1 2.4 0 3.2 2 2 1.5 1 0.5Sample Output
3 3 3.6 2 6.0 1 1.6
这道题只需要分别存放两个多项式,然后逐项处理就行了。然而我用map来做这道题,第一个点却始终过不去,不知道为什么,也希望有大虾看破了的话能指点我,以下是用map完成的代码:
#include <iostream>
#include <map>
using namespace std;
int main(void)
{
int i=0,j,k1,k2,k_re,exp,exp_p1,exp_p2,exp_result;
float coe,coe_p1,coe_p2,coe_result;
map<int,float> p1;
map<int,float> p2;
map<int,float,greater<int> > result;
cin>>k1;
while(i<k1) //input the first polynomial
{
cin>>exp>>coe;
p1[exp]=coe;
i++;
}
i=0;
cin>>k2;
while(i<k2) //input the second plynomial
{
cin>>exp>>coe;
p2[exp]=coe;
i++;
}
map<int,float>::iterator iter_p1;
map<int,float>::iterator iter_p2;
k_re=0;
for(iter_p1=p1.begin();iter_p1!=p1.end();iter_p1++)
{
exp_p1=iter_p1->first;
coe_p1=iter_p1->second;
for(iter_p2=p2.begin();iter_p2!=p2.end();iter_p2++)
{
exp_p2=iter_p2->first;
coe_p2=iter_p2->second;
exp_result=exp_p1+exp_p2;
coe_result=coe_p1*coe_p2;
if(result.count(exp_result)>0)
result[exp_result]+=coe_result;
else
{
result[exp_result]=coe_result;
k_re++;
}
}
}
map<int,float,greater<int> >::iterator iter_result;
cout.setf(ios::fixed);
cout.precision(1);
cout<<k_re;
for(iter_result=result.begin();iter_result!=result.end();iter_result++)
{
if(iter_result->second!=0.0)
{
cout<<" "<<iter_result->first;
cout<<" "<<iter_result->second;
}
}
return 0;
}
我自己也在网上寻找其他人的代码,看看是不是哪个点没考虑到,然后看到了下面这个,他使用的是数组来完成这道题。但是我经过尝试并没有发现他的代码与我的代码在结果上有哪里不同,于是非常郁闷。。。以下是用数组实现的代码(能通过PAT所有点):
#include<iostream>
#include<iomanip>
#include<string.h>
using namespace std;
#define max 1000
double input1[max + 1];
double input2[max + 1];
double result[2*max + 1];
int main()
{
memset(input1,0,sizeof(input1));
memset(input2,0,sizeof(input2));
memset(result,0,sizeof(result));
int k;
int i,j;
int e;
//int temp=0; //记录最高指数
double c;
int count = 0; //最终输出的多项式的项数。
cin>>k;
for(i=0; i<k; i++)
{
cin>>e>>c;
input1[e] += c;
}
cin>>k;
for(i=0; i<k; i++)
{
cin>>e>>c;
input2[e] += c;
}
for(i=0; i<=1000; i++)
{
for(j=0; j<=1000; j++)
{
result[i+j] += input1[i]*input2[j];
}
}
for(i=0; i<=2000; i++) if(result[i] != 0) count++;
cout<<count;
for(i=2000; i >= 0; i--)
{
if(result[i] != 0.0) {
cout<<" "<<i;
cout<<fixed<<setprecision(1);
cout<<" "<<result[i];
}
}
cout<<endl;
return 0;
}