设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
2020.3.6 数据库学习
(deque,sort,for_each,.begin和.end以及遍历条件size(也就是链表大小)的学习使用)
#include<bits/stdc++.h>
using namespace std;
struct Node{
int zi;
int xi;
};
deque<Node>a,b,c,d; //deque是创建一个容器的意思,也就是双向链表(队列),使用方法如这
bool haveflag=false;
bool firstflag=true;
void print(Node t) //for_each自动传入容器第一个参数,简单无比,夷虏最畏者也!!!!
{
if(t.xi==0)
return; //如果系数为0,则不输出
haveflag=true;
if(firstflag) //如果是第一个的话的意思
{
cout<<t.xi<<" "<<t.zi;
firstflag=false;
}
else
cout<<" "<<t.xi<<" "<<t.zi;
}
bool cmp(Node t1,Node t2) //这里的意思是t1>t2,即告诉函数应该从大到小排列
{
if(t1.zi>t2.zi)
return true;
return false;
}
int main()
{
int i,j;
int n;
cin>>n;
while(n--)
{
Node t;
cin>>t.xi>>t.zi;
a.push_back(t); //push_back会将t塞入a中,以后可以用它取代push操作
}
cin>>n;
while(n--)
{
Node t;
cin>>t.xi>>t.zi;
b.push_back(t);
d.push_back(t);
}
for(i=0;i<a.size();++i) //size明显是指容器a的大小
{
Node t;
int j;
for(j=0;j<b.size();++j)
{
t.xi=a[i].xi*b[j].xi;
t.zi=a[i].zi+b[j].zi;
int k;
bool flag=true;
for(k=0;k<c.size();++k)
{
if(c[k].zi==t.zi)
{
c[k].xi+=t.xi;
flag=false;
}
}
if(flag)
c.push_back(t);
}
bool flag1=true;
for(j=0;j<d.size();++j)
{
if(d[j].zi==a[i].zi)
{
d[j].xi+=a[i].xi;
flag1=false;
}
}
if(flag1)
d.push_back(a[i]);
}
sort(c.begin(),c.end(),cmp); //sort函数可以进行全排列,第三个参数可以作为大小排列的标准
for_each(c.begin(),c.end(),print); //for_each可以将容器从头到尾循环一遍,前两个为头和尾,第三个为执行句
if(!haveflag)
cout<<"0 0";
cout<<endl;
firstflag=true;
haveflag=false;
sort(d.begin(),d.end(),cmp); //begin end非常好用,因为这样子可以直接确定头和尾,不再需要储存
for_each(d.begin(),d.end(),print); //注意,这里的foreach同时将第一个作为参数传入print函数中
if(!haveflag)
cout<<"0 0";
cout<<endl;
return 0;
}