7-2 一元多项式的乘法与加法运算 (20分)
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
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
思路:首先需要明确的一点是采用数组做比链表做简单。以次幂为数组下角标,系数为此处的数组中的值。对于乘法,直接将两者下角标相加即可,数组中的值相乘,即为最终结果,并存入新的数组c中。对于加法,相同下角标的数组值相加即可。具体代码如下:
#include<stdio.h>
#include<math.h>
int main()
{
int flag=0,flag1=0,temp2,temp1,temp,N=0,N1=0,i,j,a[4000],b[4000],c[8000]={0},d[8000]={0};
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d%d",&temp,&j);
if(i==0)
temp1=j;
a[j]=temp;
}
scanf("%d",&N1);
for(i=0;i<N1;i++)
{
scanf("%d%d",&temp,&j);
if(i==0)
temp2=j;
b[j]=temp;
}
//乘法
for(i=0;i<=temp1;i++)
{
for(j=0;j<=temp2;j++)
if(a[i]!=0&&b[j]!=0)
{
if(c[i+j]==0)
c[i+j]=a[i]*b[j];
else
c[i+j]=c[i+j]+a[i]*b[j];
}
}
for(i=temp1+temp2;i>=0;i--)
{
if((c[i]!=0)&&flag==0)
{
printf("%d %d",c[i],i);
flag++;
}
else if(c[i]!=0)
printf(" %d %d",c[i],i);
}
if(flag!=0)
printf("\n");
else
{printf("0 0");printf("\n");}
//加法
for(i=0;i<=temp1+temp2;i++)
{
if(a[i]==0&&b[i]==0)
continue;
else
d[i]=a[i]+b[i];
}
for(i=temp1+temp2;i>=0;i--)
{
if((d[i]!=0)&&flag1==0)
{
printf("%d %d",d[i],i);
flag1++;
}
else if(d[i]!=0)
printf(" %d %d",d[i],i);
}
if(flag1==0)
printf("0 0");
}
注意一点就是:当多项式为0时打印0 0
.因此需要判断下有没有打印多项式,如果没有打印多项式,就要输出0 0