[数据结构]-- PTA一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。
输入格式:**
输入分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
大致思路
定义系数和指数放在一个多项式的结构体内,利用循环和选择进行加法
①首先比较分为三种不同的情况,指数相等,指数较大,指数较小。大的直接放入加法结果的数组中,小的将另一个多项式放入加法结果的数组中,相等则相加后再放入数组中。
②其次检查其中是否有系数为0的情况,有就直接删除就好。
③还有几种特殊的关于0的情况,直接看代码应该就懂。
乘法稍微复杂一点
①利用两层循环将所有的乘法结果放入数组中
②按照指数从大到小的顺序排列
③合并同类项,这里有两种情况,一是直接合并,合并之后后面的依次补上,另一种是合并同类项后系数为0,这要向前移动两位(这个有点难想到)
= =剩下的就是为了全部正确,各种打印输出了

#define N 30
#include <stdio.h>
typedef struct{
    int coef;//系数
    int expon;//指数
}polynomial,*Poly;
polynomial poly1[N],poly2[N],mul[N],add[N];
int m,n;
int i,j;
int temp;
//输入函数
void Input()
{
    scanf("%d",&m);
    for(i=0;i<m;i++)
        scanf(" %d %d",&poly1[i].coef,&poly1[i].expon);
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf(" %d %d",&poly2[i].coef,&poly2[i].expon);
}
//计算加法结果
void Add()
{
    i=0;j=0; temp=0;
    while(i<m||j<n)
    {
        switch(Compare(poly1[i].expon,poly2[j].expon))
        {
        case 1://前者小,将后者放入当前数组中,并自增
                add[temp++].expon=poly2[j].expon;
                add[temp-1].coef=poly2[j].coef;
                j++;
                break;
        case 2://后者小,将前者放入当前数组中,并自增
                add[temp++].expon=poly1[i].expon;
                add[temp-1].coef=poly1[i].coef;
                i++;
                break;
        case 0://二者相等相加后结果放入当前数组中
                add[temp++].coef=poly1[i].coef+poly2[j].coef;
                add[temp-1].expon=poly1[i].expon;
                i++;
                j++;
                break;
        default:
            break;

        }
    }
    for(i=0;i<temp;i++)
    {
        if(!add[i].coef)
        {
            for(j=i;j<temp;j++)
            {
                add[j].coef=add[j+1].coef;
                add[j].expon=add[j+1].expon;
            }
        }
    }
    if(add[0].coef==0)
    {
        printf("0 0");
    }
    else{
        printf("%d %d",add[0].coef,add[0].expon);
        for(i=1;i<temp;i++)
        {
            if(add[i].coef)
             printf(" %d %d",add[i].coef,add[i].expon);
        }
    }

}
//比较两个数的大小
int Compare(int k,int j)
{   
    if(k==j)
        return 0;//相等返回0
    else if(k<j)
        return 1;//前者小返回1
    else
        return 2;//后者小返回2
}
void multiplication()
{   //将乘法结果存入mul数组中
    temp=0;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            mul[temp++].coef=poly1[i].coef*poly2[j].coef;
            mul[temp-1].expon=poly1[i].expon+poly2[j].expon;
        }
    }
    int temp1,temp2;
    for(j=0;j<temp;j++)//按从大到小的顺序排列
        for(i=0;i<temp;i++)
            if(mul[i].expon<mul[i+1].expon)
            {
                temp1=mul[i].coef;          temp2=mul[i].expon;
                mul[i].coef=mul[i+1].coef;  mul[i].expon=mul[i+1].expon;
                mul[i+1].coef=temp1;        mul[i+1].expon=temp2;
            }
    int flag=0;
    for(i=0;i<temp;i++)//合并同类项,合并后系数为零时,向前移动两位
    {
        if(mul[i].expon==mul[i+1].expon)
        {
            if((mul[i].coef+mul[i+1].coef)==0)
            {
                for(j=i;j<temp;j++)
                {
                    mul[j].coef=mul[j+2].coef;
                    mul[j].expon=mul[j+2].expon;
                }
            }
            else{
                mul[i].coef+=mul[i+1].coef;
                 for(j=i+1;j<temp;j++)
                {
                mul[j].coef=mul[j+1].coef;
                mul[j].expon=mul[j+1].expon;
                }
            }

            flag++;
        }
    }
    temp-=flag;
    if(mul[0].coef==0)
    {
        printf("0 0");
    }
    else{
        printf("%d %d",mul[0].coef,mul[0].expon);//根据标记进行不同的输出
        if(flag>1){
                for(i=1;i<temp+2;i++)
            {
            if(mul[i].coef)
             printf(" %d %d",mul[i].coef,mul[i].expon);
            }
        }
        else{
            for(i=1;i<temp+1;i++)
            {
            if(mul[i].coef)
             printf(" %d %d",mul[i].coef,mul[i].expon);
            }
        }
    }
}
int main()
{
   Input();
   if(!m&&!n)
    printf("0 0\n0 0");
   else if(!m||!n){
        printf("0 0\n");
      Add();
   }
   else{
      multiplication();
      printf("\n");
      Add();
   }
    return 0;
}

多多指教~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值