多项式求和(木桶排序)

题目内容
一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。

输入格式
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中

输出格式
从最高幂开始依次降到0幂,如:
2x6+3x5+12x3-6x+20
注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。

输入样例
6 2
5 3
3 12
1 6
0 20
6 2
5 3
2 12
1 6
0 20

输出样例
4x6+6x5+12x3+12x2+12x+40

综合两位大佬写的代码

#include<stdio.h>
#include<math.h>
#define MAX 100
int main(){
    int x[MAX] = {0};//初始化数组 
    int exp=0, coef=0, count=0, n=0, m=0;
    while(count!=2){
        scanf("%d %d", &exp, &coef);
          x[exp]+=coef;
        if (exp == 0)
            count++;
        }
    for (n = MAX-1; n >= 0; n--){
        if (x[n] != 0){//系数为0不输出
            if (m != 0 && x[n] > 0)//不是第一个数,且是正数,输出+
                printf("+");
            if (x[n] < 0) //负数 输出-
                printf("-");
            if ( n != 1) {//幂不为1
                if (n == 0)//幂为0
                    printf("%d", abs(x[n]));
                else if (x[n] == 1 || x[n] == -1)//系数为1或-1
                    printf("x%d", n);
                else
                    printf("%dx%d", abs(x[n]), n);//幂为其他
            }else { //幂为1 
                if(x[n]==1 || x[n]==-1){
                    printf("x");
                }else{
                    printf("%dx",abs(x[n]));
                }
            }
            m++; //第 m个系数不为0的项
        }
    }
     if(m==0)//系数全为0
       printf("0");
    return 0;
}


我自己写的辣鸡代码【可忽略】

#include<stdio.h>
#define MAX 100 
int main(){
    int flag=2,i=0,exp=0,coef=0,max_p=0,max_c=0;
    int a[MAX];
    while(i<MAX){
        a[i]=0;
        i++;
    }
    //输入 (木桶排序)
    while(flag){
        scanf("%d %d",&exp,&coef); 
        a[exp]+=coef;
        if(exp==0)
            flag--;
    }
    //找到最大幂,并输出
    for(i=MAX-1;i>=0;i--){
        if(a[i]!=0){
            max_p=i;
            max_c=a[i];
            break;
        }
    }
    if(max_p==0)
        printf("%d",a[0]);
    else if(max_p==1){
        if(max_c==1){
            printf("x%+d",a[0]);
        }else if(max_c==-1){
            printf("-x%+d",a[0]);
        }else{
            printf("%dx%+d",max_c,a[0]);
        }
    }else{
        if(max_c==1){
            printf("x%d",max_p);
        }else if(max_c==-1){
            printf("-x%d",max_p);
        }else{
            printf("%dx%d",max_c,max_p);
        }
    }

    //其他项
    for(i=max_p-1; i>1; i--){
        if(a[i]!=0){
            if(a[i]==1){
            printf("+x%d",i);
        }else if(a[i]==-1){
            printf("-x%d",i);
        }else{
        printf("%+dx%d",a[i],i);
        }
        }
    }
    if(a[1]!=0&&max_p>1){//保证max_p>1,避免重复输出
        if(a[1]==1){
            printf("+x%+d",a[0]);
        }else if(a[1]==-1){
            printf("-x%+d",a[0]);
        }else{
            printf("%+dx%+d",a[1],a[0]);
        }
    }
    return 0;
}
/*
+%d 和 %+d的区别:
int i = 6;
printf("%+d +%d",i,i);//+6 +6
i = -6;
printf("%+d +%d",i,i);//-6 +-6
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值