PAT 甲级 1009 Product of Polynomials (25)(25 分)(坑比较多,a可能很大,a也有可能是负数,回头再看看)
1009 Product of Polynomials (25)(25 分)
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 a~N1~ N2 a~N2~ ... NK a~NK~, where K is the number of nonzero terms in the polynomial, Ni and a~Ni~ (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
算两个多项式polynomials的乘积,挺简单的一题,一开始就5分,原来c数组开太小,结果仍只有20分,原来a(未知数的次数)可能是负数,
乘积的未知数次数算出来是0的不要算进去
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<queue> #include<map> #include<vector> #include<stack> #include<map> #define inf 0x3f3f3f3f using namespace std; struct node { int k; double num; }; node a[105]; node b[105]; double c[200010]; int s=0; int main() { int n1; while(cin>>n1) { s=0;//记录最后有多少组 for(int i=1;i<=n1;i++) { cin>>a[i].k>>a[i].num; } int n2; cin>>n2; for(int i=1;i<=n2;i++) { cin>>b[i].k>>b[i].num; } memset(c,0,sizeof(c)); for(int i=1;i<=n1;i++) { for(int j=1;j<=n2;j++) { int k=a[i].k+b[j].k; if(k>0&&c[k]==0) { s++; } else if(k<0&&c[-1*k+100005]==0)//万一是负数,特殊处理 { s++; k=-1*k+100005; } c[k]+=a[i].num*b[j].num; } } cout<<s;//输出组数 for(int i=200005;i>=0;i--) { if(c[i]!=0&&i>100005) printf(" %d %.1f",-1*(i-100005),c[i]); else if(c[i]!=0&&i<=100005) printf(" %d %.1f",i,c[i]); } cout<<endl; } return 0; }