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;
}
 
原文地址:https://www.cnblogs.com/caiyishuai/p/9463813.html