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
样例输入与输出:
序号 | 输入 | 输出 |
1 | 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 |
2 | 2 1 2 1 0 2 1 2 -1 0 | 1 4 -1 0 2 2 |
3 | 2 -1000 1000 1000 0 2 1000 1000 -1000 0 | -1000000 2000 2000000 1000 -1000000 0 0 0 |
4 | 0 1 999 1000 | 0 0 999 1000 |
网址:https://pintia.cn/problem-sets/15/problems/710
代码:
#include <iostream>
#include <cstdio>
#include <stack>
#include <queue>
#include <string>
#include <sstream>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
int len1,len2;
int c1[10005],e1[10000];
int c2[10000],e2[10000];
struct node
{
int c;
int e;
node(int aa,int bb)
{
c=aa;
e=bb;
}
};
vector<node> res;
vector<node> res2;
int cmp(node aa,node bb)
{
if(aa.e>bb.e)
{
return 1;
}
else if(aa.e<bb.e)
{
return 0;
}
else
{
return aa.c>bb.c;
}
}
vector<node> solve(vector<node> res)
{
vector<node> ans;
if(res.size()==0)
{
node ttt(0,0);
ans.push_back(ttt);
return ans;
}
int sc=res[0].c;
for(int i=1;i<res.size();i++)
{
if(res[i].e==res[i-1].e)
{
sc+=res[i].c;
}
else
{
node tmp(sc,res[i-1].e);
sc=res[i].c;
ans.push_back(tmp);
}
}
node ttt(sc,res[res.size()-1].e);
ans.push_back(ttt);
return ans;
}
void shuchu(vector<node> ans)
{
if(ans.size()==1)
{
printf("%d %d\n",ans[0].c,ans[0].e);
return ;
}
if(ans.size()==0)
{
printf("0 0\n");
return;
}
for(int i=0;i<ans.size();i++)
{
if(i==0)
{
printf("%d %d",ans[i].c,ans[i].e);
}
else
{
if(ans[i].c!=0)
{
printf(" %d %d",ans[i].c,ans[i].e);
}
}
}
printf("\n");
}
vector<node> ok(vector<node> tmp)
{
for(int i=0;i<tmp.size();i++)
{
if(tmp[i].c==0)
{
tmp[i].e=0;
}
}
return tmp;
}
int main()
{
scanf("%d",&len1);
for(int i=0;i<len1;i++)
{
scanf("%d%d",&c1[i],&e1[i]);
}
scanf("%d",&len2);
for(int i=0;i<len2;i++)
{
scanf("%d%d",&c2[i],&e2[i]);
}
for(int i=0;i<len1;i++)
{
for(int j=0;j<len2;j++)
{
int tmpc=c1[i]*c2[j];
if(tmpc!=0)
{
int tmpe=e1[i]+e2[j];
node tmp(tmpc,tmpe);
res.push_back(tmp);
}
}
}
for(int i=0;i<len1;i++)
{
node ttt(c1[i],e1[i]);
res2.push_back(ttt);
}
for(int i=0;i<len2;i++)
{
node ttt(c2[i],e2[i]);
res2.push_back(ttt);
}
sort(res2.begin(),res2.end(),cmp);
sort(res.begin(),res.end(),cmp);
vector<node> ans2=solve(res2);
vector<node> ans=solve(res);
ans=ok(ans);
ans2=ok(ans2);
ans=solve(ans);
ans2=solve(ans2);
shuchu(ans);
shuchu(ans2);
return 0;
}
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <sstream>
#include <map>
#include <queue>
#include <stack>
#include <cstring>
#include <set>
using namespace std;
struct DATA
{
int c;
int e;
DATA(int aa,int bb)
{
c=aa;
e=bb;
}
};
typedef struct DATA DATA;
vector<DATA> a,b;
vector<DATA> sumtmp,jitmp,sum,ji;
int n,m;
int cmp(DATA aa,DATA bb)
{
if(aa.e>bb.e)
{
return 1;
}
else
{
return 0;
}
}
vector<DATA> solve(vector<DATA> tmp)
{
vector<DATA> ans;
if(tmp.size()==0)
{
DATA aaa(0,0);
ans.push_back(aaa);
return ans;
}
for(int i=0;i<tmp.size();i++)
{
if(tmp[i].c==0)
{
tmp[i].e=0;
}
}
sort(tmp.begin(),tmp.end(),cmp);
int cur=tmp[0].e;
int cs=0;
for(int i=0;i<tmp.size();i++)
{
if(tmp[i].e==cur)
{
cs+=tmp[i].c;
}
else
{
if(cs!=0)
{
DATA now(cs,cur);
ans.push_back(now);
}
cur=tmp[i].e;
cs=0;
cs+=tmp[i].c;
}
}
if(cs!=0)
{
DATA now(cs,cur);
ans.push_back(now);
}
for(int i=0;i<ans.size();i++)
{
if(ans[i].c==0)
{
ans[i].e=0;
}
}
return ans;
}
void shuchu(vector<DATA> tmp)
{
if(tmp.size()==0)
{
printf("0 0\n");
}
else
{
for(int i=0;i<tmp.size();i++)
{
if(i==0) printf("%d %d",tmp[i].c,tmp[i].e);
else printf(" %d %d",tmp[i].c,tmp[i].e);
}
printf("\n");
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
DATA tmp(x,y);
a.push_back(tmp);
}
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
DATA tmp(x,y);
b.push_back(tmp);
}
for(int i=0;i<n;i++)
{
sumtmp.push_back(a[i]);
}
for(int i=0;i<m;i++)
{
sumtmp.push_back(b[i]);
}
sum=solve(sumtmp);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int x,y;
x=a[i].c*b[j].c;
y=a[i].e+b[j].e;
DATA tmp(x,y);
jitmp.push_back(tmp);
}
}
ji=solve(jitmp);
shuchu(ji);
shuchu(sum);
return 0;
}