开始做的时候想到了做过的1002,也是处理多项式,只不过换成了乘法,开始的想法是跟之前一样用两个数组储存两次输入,然后用第三个数组储存结果,乘法实现与笔算时逻辑相同,用第一个数组里的每一个数分别乘第二个数组里的每一个数,代码如下
#include<stdio.h>
int main(){
int i,j,k,n,max=0;
double index1[1001]={0.0};
double index2[1001]={0.0};
double index[2002]={0.0};
int maxindex=0;
int flag=1;
int cnt=0;
for(i=0; i<2; i++,flag--){
scanf("%d",&k);
for(k; k!=0; k--){
if(flag==1){
scanf("%d",&n);
scanf("%lf",&index1[n]);
}else if(flag==0){
scanf("%d",&n);
scanf("%lf",&index2[n]);
}if(n>maxindex){
maxindex=n;
}
}
}
for(i=maxindex; i>=0; i--){
if(index1[i]!=0){
for(j=maxindex; j>=0; j--){
if(index2[j]!=0){
index[i+j]+=index1[i]*index2[j];
if((i+j)>max){
max=i+j;
}
}
}
}
}
for(i=0; i<=max; i++){
if(index[i]!=0){
cnt++;
}
}
printf("%d",cnt);
for(i=max; i>=0; i--){
if(index[i]!=0){
printf(" %d %.1lf",i,index[i]);
}
}
return 0;
}
提交正确后上网查了一下,发现了更简单的方法用两个数组即可解决,于是改进了一下,改进后代码如下
#include<stdio.h>
int main(){
double index[1001]={0.0};
double ret[2002]={0.0};
double a=0.0;
int k,i,j,n,maxindex=0;
int cnt=0;
scanf("%d",&k);
for(i=0; i<k; i++){
scanf("%d",&n);
scanf("%lf",&index[n]);
if(n>maxindex){
maxindex=n;
}
}
scanf("%d",&k);
for(i=0; i<k; i++){
scanf("%d %lf",&n,&a);
for(j=0; j<=maxindex; j++){
ret[j+n]+=index[j]*a;
}
}
for(i=0; i<=2000; i++){
if(ret[i]!=0){
cnt++;
if(i>maxindex){
maxindex=i;
}
}
}
printf("%d",cnt);
for(i=maxindex; i>=0; i--){
if(ret[i]!=0){
printf(" %d %.1lf",i,ret[i]);
}
}
return 0;
}
发现网上其他人好多都是直接从数组的第0个遍历到最后一个2000,我觉得那样会浪费很多时间去遍历没有意义的数据,于是我用了一个maxindex来限制遍历时的末位置,不知道有无意义。