这题要注意数组越界的问题(第一次提交的时候就是数组越界了)
两种方法:
- 只用a[e] = c的形式存储多项式,这样会略麻烦;
- 第一个多项式利用结构体表示,然后结果放在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; }