代码内部有较为详细的题解,内含有结构体嵌套的排序。
先来看看题目要求:
输入包含两行,每行一个一元多项式。
每行开头一个小于10000的正整数n,表示该多项式非零项项数,后面有n组数字,每组数字包含两个数字,按顺序分别为该项的系数和指数。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出包含一行,按指数从大到小的顺序输出乘积的非0项的系数与指数,以空格分隔开。
如果最终结果为0,直接输出0 0。
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node{
int r;//系数
int e;//指数
}; //结构体嵌套
struct List{
Node data[10005];
int len;
};
void PrintList(const List& list)//输出函数
{
int flag=0;
for(int p=0;p<list.len-1;p++)
{
if(list.data[p].e!=list.data[p+1].e)
{
if(list.data[p].r)
{
cout<<list.data[p].r<<" "<<list.data[p].e<<" ";
flag=1;
}
}
}
if(list.data[list.len-1].r)//做了一个特殊处理,使得最后一个输出的是回车而不是空格
{
flag=1;
cout<<list.data[list.len-1].r<<" "<<list.data[list.len-1].e<<endl;
}
if(flag==0) cout<<"0 0"<<endl;
}
List InputList(){//输入函数
List list; //重新定义一个
list.len=0; //可以省去调函数进行初始化的步骤
int r,e;
int n;
cin>>n;
while(n--)
{
cin>>r>>e;
int index=list.len;
list.data[index].r=r;
list.data[index].e=e;
list.len++;//每次输入两个值以后list的长度就要增加
}
return list;
}
bool cmp(Node list1,Node list2)//自定义的比较函数,下面sort会使用,至于为什么要用Node
//是因为list.data本质是Node类型的,而我确实是要比较出list.data.e大小
{
return list1.e>list2.e;
}
List mul(const List& list1,const List& list2)
{
struct List list;
list.len=0;
for(int i=0;i<list1.len;i++)
{
for(int j=0;j<list2.len;j++)
{
list.data[list.len].r=list1.data[i].r*list2.data[j].r;
list.data[list.len].e=list1.data[i].e+list2.data[j].e;
list.len++;
}
}
for(int i=1;i<list.len;i++)
{
if(list.data[i].e==list.data[i-1].e) //若指数一样就把系数合并
{
list.data[i].r+=list.data[i-1].r;
}
}
sort(list.data,list.data+list.len,cmp);//使用自定义的比较函数
return list;
}
int main(){
List list1 = InputList();
List list2 = InputList();
List list = mul(list1, list2);
PrintList(list);
return 0;
}