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
我的代码
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
//typedef long long int LL;
bool compare(int a,int b)
{
return a>b; //升序排列,如果改为return a>b,则为降序
}
void printf(vector<int> index_sum,int sum[])
{
sort(index_sum.begin(),index_sum.end(),compare);
int f=1,i=0;
if(i<(int)index_sum.size())
{
while(f)
{
if(sum[index_sum[i]])
{
f=0;
cout<<sum[index_sum[i]]<<" "<<index_sum[i];
}
i++;
}
}
while(i<(int)index_sum.size())
{
if(sum[index_sum[i]])
cout<<" "<<sum[index_sum[i]]<<" "<<index_sum[i];
i++;
}
if(f)cout<<"0 0";
}
int main()
{
int a[10000]= {0};
int b[10000]= {0};
vector<int> index_a;
vector<int> index_b;
int sum[10000]= {0};
int mul[10000]= {0};
vector<int> index_sum;
vector<int> index_mul;
int n1,n2,coe,index;
cin>>n1;
for(int i=0; i<n1 ; i++)
{
cin>>coe>>index;
index_a.push_back(index);
a[index]=coe;
sum[index]=coe;
index_sum.push_back(index);
}
//读入第二个多项式
cin>>n2;
for(int i=0; i<n2 ; i++)
{
cin>>coe>>index;
b[index]=coe;
index_b.push_back(index);
//如果b*X^n在第一个多项式中没有同类项
if(sum[index]==0)
{
index_sum.push_back(index);
}
sum[index]+=coe;
}
for(int i=0;i<n1;i++){
for(int j=0;j<n2;j++){
int index_new=index_a[i]+index_b[j];
//cout<<index_new;
if(mul[index_new]==0){
index_mul.push_back(index_new);
}
mul[index_new]+=a[index_a[i]]*b[index_b[j]];
}
}
printf(index_mul,mul);
cout<<endl;
printf(index_sum,sum);
return 0;
}
大体讲一下我的思路:
用数组存多项式,数组的下标代表某一项的指数,数组元素即某一项的值。例如sum[10]=90代表90X^10,这样做加法运算和乘法运算都很方便,但是有一个问题:指数变化不连续,可能导致数组十分稀疏,增大时间复杂度。例如,一个多项式10x+x ^2000,遍历这个数组会浪费很多算力。解决办法:用动态数组vector存索引,然后将索引数组index按照降序排列。