这题要注意数组越界的问题(第一次提交的时候就是数组越界了)
两种方法:

  1. 只用a[e] = c的形式存储多项式,这样会略麻烦;
  2. 第一个多项式利用结构体表示,然后结果放在a[e]中;(这个代码简洁)

方法一代码:

#include<stdio.h>
#include<algorithm>

using namespace std;

const int max_n = 2005;

int main(){

    double p[max_n+100] = {0};
    double q[10][max_n+100] = {0};

    int n,count=0;

    double a;        //系数

    int k;
    scanf("%d",&k);

    for(int i=0;i<k;i++){
        scanf("%d %lf",&n,&a);
        p[n] = a;
    } 

    scanf("%d",&k);
    for(int i=0;i<k;i++){
        scanf("%d %lf",&n,&a);
        for(int j=0;j<max_n;j++){
            q[i][j+n] = p[j]*a;
        }
    }

    double h[max_n+100] = {0};

    for(int i=0;i<k;i++){
        for(int j=0;j<max_n;j++){
            h[j] += q[i][j];
        }
    }

    for(int i=0;i<max_n;i++){
        if(h[i]!=0){
            count++;
        }
    }

    printf("%d",count);

    for(int i=max_n-1;i>=0;i--){
        if(h[i]!=0){
            printf(" %d %.1f",i,h[i]);
        }
    }

    return 0;
}

方法二代码:
还有一种用结构体的写法:

#include<cstdio>
#include<algorithm> 

struct Poly{
    int exp;        //指数
    double cof;        //系数 
}poly[1001];        //代表第一个多项式 

int main(){

    int count = 0;
    double ans[2001] = {0};        //用来存放结果,因为相乘的最大系数为2000所以数组最小开到2001 



    int n;
    scanf("%d",&n);

    for(int i=0;i<n;i++){        //读入第一个多项式 
        scanf("%d %lf",&poly[i].exp,&poly[i].cof);
    } 

    int m;
    scanf("%d",&m);

    for(int i=0;i<m;i++){        //计算结果 
        int exp;
        double cof;
        scanf("%d %lf",&exp,&cof);
        for(int j=0;j<n;j++){    //读取到的每一项与第一个多项式相乘,加到ans[]中 
            ans[exp + poly[j].exp] += cof*poly[j].cof; 
        }
    }

    for(int i=0;i<2001;i++){
        if(ans[i]!=0){
            count++;
        }
    } 

    //输出 
    printf("%d",count);
    for(int i=2000;i>=0;i--){
        if(ans[i]!=0.0){
            printf(" %d %.1f",i,ans[i]);
        } 
    }



    return 0;
}