这种多项式其实都大同小异,用数组或者struct存储,数组下标表示次数,数组元素表示系数。
要点:
1.没有注意到相乘的最大次数是2000,导致第四个测试点无法通过。
2.可以把第一个多项式用struct数组保存,这样比较清晰明了。
3.注意输出。
#include <cstdio> struct Poly{ int exp; double cof; }poly[1001]; double ans[2001]; int main(){ int n,m,number=0; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d%lf",&poly[i].exp,&poly[i].cof); } 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[exp+poly[j].exp]+=(cof*poly[j].cof); } } for(int i=0;i<=2000;i++){ if(ans[i]) number++; } printf("%d",number); for(int i=2000;i>=0;i--){ if(ans[i]) printf(" %d %.1f",i,ans[i]); } return 0; }
自己做法是用两个数组,大同小异。
#include <cstdio> const int max_n=1111; double p[max_n]={}; double q[max_n*2]={}; int co[11]={}; int main(){ int k,n,len,high=0,sum=0; double a; scanf("%d",&k); len=k; for(int i=0;i<k;i++){ scanf("%d%lf",&n,&a); p[n]=a; co[i]=n; } scanf("%d",&k); while(k--){ scanf("%d%lf",&n,&a); for(int j=0;j<len;j++){ q[n+co[j]]+=a*p[co[j]]; if(n+co[j]>high) high=n+co[j]; } } for(int i=0;i<=high;i++){ if(q[i]) sum++; } printf("%d",sum); for(int i=high;i>=0;i--){ if(q[i]) printf(" %d %.1f",i,q[i]); } }
原文:https://www.cnblogs.com/kimeina/p/14300587.html