一元多项式的乘法与加法运算
输入格式:
输入分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
思路
用了太多次链表实在是用吐了,虽然运行起来很爽,但是编写太麻烦了,换数组解决。这里参考了一下其他大佬的思路
问题的关键在于变量其实是两个(指数和系数),放在一起紧挨着或分成两个数组都不好处理,尤其是多项式相乘是一种交叉相乘的计算。
比较巧妙的处理方式是将取数组的位置为指数,该位置对应的值为系数。
应注意反之不可,因为可以存在n倍的x0(即常数),而不存在0倍的xn。区别于其他干扰数可以通过初始化数组为0来实现。
参考:https://www.cnblogs.com/yuxiaoba/p/8326018.html
https://www.cnblogs.com/Jie-Fei/p/10138885.html
代码:
#include<bits/stdc++.h>
using namespace std;
#define P 10000
int main()
{
int a[10000]= {0},b[10000]= {0};//输入数组
int c[10000]= {0},d[10000]= {0};//结果数组
int n,m;
int i,j;
int flag; //用于判断输出空格
int x,y; //系数&指数scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d %d",&x,&y);
a[y]=x; //指数为位置,系数为数组
}
scanf("%d",&m); //同上输入
for(i=0; i<m; i++)
{
scanf("%d %d",&x,&y);
b[y]=x;
}
for(i=P-1; i>=0; i--) //////////两数相乘
{
if(a[i]!=0)
{
for(j=0; j<P; j++)
{
if(b[j]!=0)
{
c[i+j]+=a[i]*b[j];
}
}
}
}
flag=0; //输出乘式
for(i=P-1; i>=0; i--)
{
if(c[i]!=0)
{
if(flag!=0)
printf(" ");
printf("%d %d",c[i],i);
flag++;
}
}
if(flag==0 ) //扣分点
{
printf("0 0");
}
printf(" "); //换行for(i=P-1; i>=0; i--) //两式相加
{
if(a[i]!=0)
d[i]+=a[i];
if(b[i]!=0)
d[i]+=b[i];
}
flag=0; //输出加式
for(i=P-1; i>=0; i--)
{
if(d[i]!=0)
{
if(flag!=0)
printf(" ");
printf("%d %d",d[i],i);
flag++;
}
}
if(flag==0 ) //扣分点
{
printf("0 0");
}
}