题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805509540921344
一、可借鉴的
1. 尽量少的创建数组
算法笔记中的方法,没有必要开两个数组存储系数再进行处理,在读入第二个系数时就可以一边读一边处理了。
2. 结尾不输出空格时
用这种方法减少程序长度
printf("%d",number);for(int i =2000;i>=0;i--){if(ans[i]!=0.0){printf(" %d %.1f",i,ans[i]);}}
二、代码
1. 算法笔记
#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+ploy[j].exp] += (cof*poly[j].cof);}}for (int i = 0;i<=2000;i++){if(ans[i]!=0.0)number++;}printf("%d",number);for(int i =2000;i>=0;i--){if(ans[i]!=0.0){printf(" %d %.1f",i,ans[i]);}}return 0;}
2. 俺的代码
#include<cstdio>
int main(){
double f1[1001] = {0},f2[1001] = {0},f3[2001] = {0.0};//f1、f2里分别存第一行和第二行的系数
for(int i = 0;i<1001;i++)//初始化f1\f2\f3
{
f1[i] = 0;
f2[i] = 0;
}
//for(int i = 0;i<2002;i++)//初始化f3
// {
// f3[i] = 0;
//}
int K1 = 0,K2 = 0;
int k;
double e;
int count = 0;
scanf("%d",&K1);
for(int i = 0;i < K1;i++)
{
scanf("%d %lf",&k,&e);
f1[k] = e;
//printf("f1[%d] = %f\n",k,e);
}
scanf("%d",&K2);
for(int i = 0;i < K2;i++)
{
scanf("%d %lf",&k,&e);
f2[k] = e;
//printf("f2[%d] = %f\n",k,e);
}
//合并f1和f2;
for(int i = 0;i<1001;i++)
{
for(int j = 0;j<1001;j++)
{
f3[i+j] += f1[i]*f2[j];
//if(f3[i+j]!=0.0)printf("f3[%d] = %f\n",i+j,f3[i+j]);
}
}
for(int i = 0;i<=2000;i++)
{
if(f3[i]!=0.0)count++;
}
printf("%d ",count);
for(int i = 2000;i>=0;i--)
{
if(f3[i]!=0){
printf("%d %.1f",i,f3[i]);
count--;
if(count!=0)printf(" ");
}
}
}
