输入格式:
输入分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
思路:因为本题多项式的指数不会过于庞大,所以可以利用类似桶排的原理来巧妙的纪录所要求的多项式和以及多项式乘法,代码如下:(但如果某个多项式的指数很大事(>10^5)就不建议使用这种办法,实在是太浪费空间)。
#include<stdio.h>
#define n 11234
int main()
{
int a[n]={0};
int b[n]={0};
int c[n]={0};
int sum[n]={0};
int m,k,x,z,i,j,flag;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d %d",&x,&z);
a[z]+=x;//所有指数相同的系数和,用数组下标代表指数;
}
scanf("%d",&k);
for(i=0;i<k;i++)
{
scanf("%d %d",&x,&z);
b[z]+=x;//同理;
}
flag=0;
//多项式乘法;
for(i=0;i<n;i++)
{
if(a[i])//指数为i的系数不为0时,才将其纪录。
{
for(j=0;j<n;j++)
{
if(b[j])
{
c[i+j]+=a[i]*b[j];
}
}
}
}
for(i=n-1;i>=0;i--)//按照指数递降的方式输出;
{
if(c[i])//当指数为i的系数和不为0时才将其输出,同时flag++解决了没有多项式的时候输出0 0的问题。
{
if(flag)
printf(" ");
printf("%d %d",c[i],i);
flag++;
}
}
if(flag==0)
printf("0 0");
printf("\n");
//多项式加法;
for(i=0;i<n;i++)
{
if(a[i])
{
sum[i]+=a[i];
}
}
for(j=0;j<n;j++)
{
if(b[j])
{
sum[j]+=b[j];
}
}
flag=0;
for(i=n-1;i>=0;i--)
{
if(sum[i])
{
if(flag)
printf(" ");
printf("%d %d",sum[i],i);
flag++;
}
}
if(flag==0)
printf("0 0");
printf("\n");
}