设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e4;
int a[maxn],b[maxn],c[maxn],d[maxn];
int x,z; // 系数,指数
int cnt =0;
int maxeps1=-100;
int maxeps2=-100;
int main()
{
memset(b,0,sizeof b);
memset(a,0,sizeof a);
memset(c,0,sizeof c);
memset(d,0,sizeof d);
int n;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>x>>z; //第一个多项式
a[z]+=x;
maxeps1=max(maxeps1,z);
}
cin>>n;
for(int i=0; i<n; i++)
{
cin>>x>>z; //第二个多项式
b[z]+=x;
maxeps2=max(maxeps2,z);
}
for(int i=maxeps1; i>=0; i--)
{
if(a[i])
for(int j=0; j<=maxeps2; j++)
{
if(b[j])
c[i+j]+=a[i]*b[j];
}
}
for(int i=maxeps1+maxeps2; i>=0; i--)
{
if(c[i])
{
if(cnt)
printf(" ");
printf("%d %d",c[i],i);
cnt++;
}
}
if(!cnt)
printf("0 0");
printf("\n");
cnt=0;
for(int i=max(maxeps1,maxeps2); i>=0; i--)
{
if(a[i]||b[i])
d[i]+=a[i]+b[i];
}
for(int i=max(maxeps1,maxeps2); i>=0; i--)
{
if(d[i])
{
if(cnt)
printf(" ");
printf("%d %d",d[i],i);
cnt++;
}
}
if(!cnt)
printf("0 0");
printf("\n");
return 0;
}