原题目地址请移步此处(习题集已关闭,无法提交):点击此处
题目
Input:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
Output:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
题目分析
在课程内何钦铭老师讲解了用链表处理的方法,在此笔者提供一种完全用数组模拟的方法 其实是因为懒得写链表
纯暴力模拟,没什么好说的;
代码:
#include<bits/stdc++.h>
using namespace std;
int base1[1005],base2[1005],n1,n2,len1,len2;
int cul[100005],sum[100005],counter=0;
int counter1=0,counter2=0;
typedef struct
{
int base,power;
}node;
node _cul[100005],_sum[10005];
int main()
{
for(int i=0;i<1005;i++) base1[i]=0,base2[i]=0;
scanf("%d",&n1);
for(int i=0;i<2*n1;i+=2){
int t1,t2;
scanf("%d%d",&t1,&t2);
base1[t2]=t1;
if(i==0) len1=t2;
}
scanf("%d",&n2);
for(int i=0;i<2*n2;i+=2){
int t1,t2;
scanf("%d%d",&t1,&t2);
base2[t2]=t1;
if(i==0) len2=t2;
}
for(int i=0;i<=(n1-1)*(n2-1);i++) cul[i]=0,sum[i]=0;
for(int i1=0;i1<=len1;i1++){
for(int i2=0;i2<=len2;i2++){
cul[i1+i2]+=(base1[i1]*base2[i2]);
counter=max(counter,i1+i2);
}
}
for(int i=counter;i>=0;i--){
if(cul[i]==0) continue;
_cul[counter1].base=cul[i];
_cul[counter1++].power=i;
}
for(int i=max(len1,len2);i>=0;i--){
sum[i]=base1[i]+base2[i];
if(sum[i]==0) continue;
_sum[counter2].base=sum[i];
_sum[counter2++].power=i;
}
if(counter1!=0) for(int i=0;i<counter1;i++) if(i==counter1-1) printf("%d %d",_cul[i].base,_cul[i].power); else printf("%d %d ",_cul[i].base,_cul[i].power);
else printf("0 0");
printf("\n");
if(counter2!=0) for(int i=0;i<counter2;i++) if(i==counter2-1) printf("%d %d",_sum[i].base,_sum[i].power); else printf("%d %d ",_sum[i].base,_sum[i].power);
else printf("0 0");
return 0;
}