设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过10000的整数)。数字间以空格分隔。
输出格式:
输出分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;
#define N 10100
int a[N],b[N],c[N],d[N];//a:第一个多项式,b:第二个多项式,c:a,b乘积多项式,d:a,b和多项式
int main()
{
int m,n,tmp1,tmp2,count=0;//tmp1:系数,tmp2:指数 ,,count用于最后的输出格式控制
cin>>m;
for(int i=0;i<m;i++){
cin>>tmp1>>tmp2;
a[tmp2]=tmp1;//指数为数组的下标,系数为数组的值
}
cin>>n;
for(int j=0;j<n;j++){
cin>>tmp1>>tmp2;
b[tmp2]=tmp1;
}
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(a[i]&&b[j]){
c[i+j]+=a[i]*b[j];//c数组是新的空数组,算法是指数相加,系数相乘,注意是+=,
//因为有可能出现指数相同的情况
}
}
}
for(int i=0;i<N;i++){
if(a[i]||b[i])
d[i]+=b[i];//d数组是新的空数组,算法是系数相加,注意是+=
d[i]+=a[i];
}
for(int k=N;k>=0;k--){
if(c[k]){
if(count) cout<<' ';
cout<<c[k]<<' '<<k;
count++;
}
}
if(count==0)
cout<<"0 0";
cout<<endl;
count=0;
for(int k=N;k>=0;k--){
if(d[k]){
if(count) cout<<' ';
cout<<d[k]<<' '<<k;
count++;
}
}
if(count==0)
cout<<"0 0";
return 0;
}