拼题a作业 02-线性结构2 一元多项式的乘法与加法运算

刚开始写的时候状态不是很好,代码写的不怎么漂亮

#include"stdio.h"
#include"stdlib.h"
#include"string.h"

typedef struct {
  int c;
  int index;
}polynomial;

void multi(polynomial *a,polynomial *b,polynomial *mul,int num1,int num2);
void add(polynomial *a,polynomial *b,polynomial *adda,int num1,int num2);
void sort(polynomial *a,int num);
int compare(int a,int b);


int main()
{int num1;
scanf("%d",&num1);
polynomial *a=(polynomial *)malloc(num1*sizeof(polynomial));
for(int i=0;i<num1;i++)
  scanf("%d%d",&a[i].c,&a[i].index);
int num2;
scanf("%d",&num2);
polynomial *b=(polynomial *)malloc(num2*sizeof(polynomial));
for(int i=0;i<num2;i++)
  scanf("%d%d",&b[i].c,&b[i].index);
polynomial *mul=(polynomial *)malloc((num2*num1+1)*sizeof(polynomial));
polynomial *adda=(polynomial *)malloc((num2*num1+1)*sizeof(polynomial));
memset (mul,0,num1*num2+1);
memset(adda,0,num1*num2+1);
multi(a,b,mul,num1,num2);
add(a,b,adda,num1,num2);

if(mul[0].c==0)
  printf("0 0");
else
  for(int i=0;i<num1*num2+1;i++)
    {if(mul[i].c!=0)
      printf("%d %d",mul[i].c,mul[i].index);
     if(mul[i+1].c!=0&&i<num1*num2) printf(" ");}

printf("\n");    
if(adda[0].c==0)
  printf("0 0");
else
  for(int i=0;i<num1*num2+1;i++)
    {if(adda[i].c!=0)
      printf("%d %d",adda[i].c,adda[i].index);
     if(adda[i+1].c!=0&&i<num1*num2) printf(" ");}
return 0;}


void multi(polynomial *a,polynomial *b,polynomial *mul,int num1,int num2)
{int quantity=0;
for(int i=0;i<num1;i++) 
    for(int j=0;j<num2;j++)
       {mul[quantity].c=a[i].c*b[j].c;mul[quantity].index=a[i].index+b[j].index;++quantity;}
for(int i=0;i<num1*num2+1;i++)
   for(int j=0;j<num1*num2;j++)
        if(i!=j&&mul[i].index==mul[j].index&&mul[i].c!=0&&mul[j].c!=0)
           {mul[i].c=mul[i].c+mul[j].c;mul[j].index=0;mul[j].c=0;}

sort(mul,num1*num2+1);
return;}

void add(polynomial *a,polynomial *b,polynomial *adda,int num1,int num2)
{int i=0,j=0,z=0;
//这里两个循环是为了解决输入相同数字的情况,题目没有这个测试点,删了也能满分
{for(int x=0;x<num1;x++)
   for(int y=0;y<num1;y++)
        if(x!=y&&a[x].index==a[y].index&&a[x].c!=0&&a[y].c!=0)
           {a[x].c=a[x].c+a[y].c;a[y].index=0;a[y].c=0;}
for(int x=0;x<num2;x++)
   for(int y=0;y<num2;y++)
        if(x!=y&&b[x].index==b[y].index&&b[x].c!=0&&b[y].c!=0)
           {b[x].c=b[x].c+b[y].c;b[y].index=0;b[y].c=0;}}
//*************
while(i<num1&&j<num2)
     switch(compare(a[i].index,b[j].index)){
     case 1:
           adda[z]=a[i];
           z=z+1;
           i=i+1;
           break;
     case -1:
           adda[z]=b[j];
           z=z+1;
           j=j+1;
           break;
     case 0:
           adda[z].index=a[i].index;
           adda[z].c=a[i].c+b[j].c;
           z=z+1;j=j+1;i=i+1;
           break;
     }
while(i<num1) 
     {adda[z]=a[i];++z;++i;}
while(j<num2)
     {adda[z]=b[j];++z;++j;}
return;}

void sort(polynomial *a,int num)
{polynomial temp={0};
for(int i=0;i<num;i++)
     for(int j=0;j<num-1;j++)
         if(a[j].index<a[j+1].index)
         {temp=a[j];a[j]=a[j+1];a[j+1]=temp;}
int x=0;
while(a[x].c!=0&&a[x].index!=0) ++x;
int z=0;
for(z;z<num;z++)
     {if(a[z].c!=0&&a[z].index!=0)
     break;}
if(a[x].c==0&&a[x].index==0)
{if(z>x)
a[x]=a[z];}
return;}

int compare(int a,int b)
{if(a>b)
return 1;
if(a<b)
return -1;
if(a==b)
return 0;}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值