数据结构.顺序表.一元多项式的乘法运算

代码内部有较为详细的题解,内含有结构体嵌套的排序。

先来看看题目要求:

输入包含两行,每行一个一元多项式。
每行开头一个小于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;
 }

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值