#include <stdio.h>
#define N2 2001
#define N1 1001
void addition(int a[], int b[]);
void multiplication(int a[], int b[]);
int main()
{
int a[N1]={0}, b[N1]={0}, a1, b1, i, x, j;
scanf("%d",&b1);
for(i=0; i<b1; i++){
scanf("%d",&x);
scanf("%d",&j);
b[j]=x;
}
scanf("%d",&a1);
for(i=0; i<a1; i++){
scanf("%d",&x);
scanf("%d",&j);
a[j]=x;
}
multiplication(a,b);
printf("\n");
addition(a,b);
return 0;
}
void addition(int a[], int b[])
{
int c[N1], isfirst=0, iszero=0;
for(int i=0; i<N1; i++)
c[i]=a[i]+b[i];
for(int j=N1-1; j>=0; j--)
{
if(c[j]!=0){
iszero++;
if(isfirst)
printf(" %d %d",c[j], j);
if(!isfirst){
printf("%d %d",c[j], j);
isfirst=1;
}
}
}
if(iszero==0)
printf("%d %d",0, 0);
}
void multiplication(int a[], int b[])
{
int d[N2]={0};
for(int i=0; i<N2; i++){
if(i<=N1){
for(int j=0; j<=i; j++)
d[i]+=a[j]*b[i-j];
}
else{
for(int m=i-N1; m<=N1; m++){
d[i]+=a[m]*b[i-m];
}
}
}
int isfirst=0, iszero=0;
for(int j=N2-1; j>=0; j--)
{
if(d[j]!=0){
iszero++;
if(isfirst)
printf(" %d %d",d[j], j);
if(!isfirst){
printf("%d %d",d[j], j);
isfirst=1;
}
}
}
if(iszero==0)
printf("%d %d",0, 0);
}
总结:
1、题目说输入K<1000,由此想到应该用数组。
2、先写加法,此时遇到,条件语句下如何数字间以空格分隔,但开头、结尾不能有多余空格。 可以通过if语句来判断是否是首句输出,引入int isfirst=0;
首句打印后isfirst+1。这里挺精彩的。
int isfirst=0, iszero=0;
for(int j=N2-1; j>=0; j--)
{
if(d[j]!=0){
iszero++;
if(isfirst)
printf(" %d %d",d[j], j);
if(!isfirst){
printf("%d %d",d[j], j);
isfirst=1;
}
}
}
还要注意,这两个if语句不能换位置,不然满足条件第一个j,两个if会同时执行。
2、乘法。首先用阶次低的多项式在草稿纸上写一下,找规律。发现,乘法结果d[i]=∑a[j]*b[i-j],然后慢慢地调整。分两种情况,i<=1001和1001<i<2001两种情况。
3、原谅小白,用了两个scanf("%d",&x);
,scanf可以同时输入两个数据。害,我这该死的基础。冲冲冲!