题目描述
给定两个多项式 A 和 B,计算 A×B 的结果。
输出格式
按照与输入相同的格式,输出 A×B 的结果。
结果中的各项的系数均保留一位小数。
样例
输入样例:
2 1 2.4 0 3.2
2 2 1.5 1 0.5
输出样例:
3 3 3.6 2 6.0 1 1.6
算法1
题目给定多项式中每一项的指数和系数,对多项式进行相乘,例如$(3x2+2x3)∗(x2+x)=3x3+5x4+2x5(3x2+2x3)∗(x2+x)=3x3+5x4+2x5$
1、开一个c[]数组,c[i]存储的是指数是i的系数是c[i]
2、将A多项式的指数和系数存在a[]数组中,B多项式的指数和系数存在b[]数组中
3、将A多项式与B多项式的每一项进行相乘,系数相乘,指数相加,即将a[]数组中每个元素与b[]数组中的每个元素进行相乘,结果存在c[]中,即c[i + j] += a[i] * b[j]
4、将c[]数组中存的指数和系数从大到小输出
C++ 代码
#include<bits/stdc++.h>
using namespace std;
const int N=1001;
double a[N],b[N],c[2*N];
int main()
{
int n,m;
cin>>n;
for(int i=0;i<n;i++)
{
int x;
double y;
cin>>x>>y;
a[x]+=y;
}
cin>>m;
for(int i=0;i<m;i++)
{
int x; //指数
double y; //系数
cin>>x>>y;
b[x]+=y;
}
//模拟多项式的乘法
for(int i=0;i<=1000;i++)
for(int j=0;j<=1000;j++)
c[i+j]+=a[i]*b[j];
int k=0;
for(int i=0;i<=2000;i++)
if(c[i]!=0) k++;
cout<<k;
for(int i=2000;i>=0;i--)
{
if(c[i]!=0)
{
printf(" %d %.1lf",i,c[i]);
}
}
return 0;
}
算法2
简单模拟~
double类型的arr数组保存第⼀组数据,ans数组保存结果。当输⼊第⼆组数据的时候,⼀边进⾏运算
⼀边保存结果。最后按照指数递减的顺序输出所有不为0的项~
注意:因为相乘后指数可能最⼤为2000,所以ans数组最⼤要开到2001
C++ 代码
#include <iostream>
using namespace std;
int main() {
int n1, n2, a, cnt = 0;
scanf("%d", &n1);
double b, arr[1001] = {0.0}, ans[2001] = {0.0};
for(int i = 0; i < n1; i++) {
scanf("%d %lf", &a, &b);
arr[a] = b;
}
scanf("%d", &n2);
for(int i = 0; i < n2; i++) {
scanf("%d %lf", &a, &b);
for(int j = 0; j < 1001; j++)
ans[j + a] += arr[j] * b;
}
for(int i = 2000; i >= 0; i--)
if(ans[i] != 0.0) cnt++;
printf("%d", cnt);
for(int i = 2000; i >= 0; i--)
if(ans[i] != 0.0)
printf(" %d %.1f", i, ans[i]);
return 0; }