acm训练 多项式加法

题目内容:
一个多项式可以表达为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<stdlib.h>
int main()
{
    int *su = calloc(101, sizeof(int));
    int *ptom = calloc(101, sizeof(int));
    int cnt = 0; //配合ptom储存幂的数值
    int n = 0;
    int number = 0; //用来记下要输出项的个数
    int m, x;
    int is = 0;
    int i;
    int max1, max2; //分别用来储存两个多项式的最高次幂
    while (scanf("%d%d", &m, &x) != EOF)
    {
        if (is == 0 && n == 0) { max1 = m; is = 1; }
        else if(is==0 && n==1) { max2 = m; is = 1; }
        *(su + m) += x;
        if (n == 0) { number++; *(ptom + cnt++) = m; }
        if (n == 1) //加上第二个多项式与第一个多项式不同幂的个数
        {
            int not_in = 1;
            for (i = 0; i < cnt; i++)
                if (*(ptom + i) == m) not_in = 0;
            if (not_in == 1) { *(ptom + cnt++) = m; number++;}
        }
        if(m==0) 
        {
            n++;
            is = 0; //再次初始化判断条件用于第二个多项式的判断
            if (n == 2) break;
        }
    }
    int t;
    int max = max1 > max2 ? max1 : max2; //max用来储存结果的最高次幂
    for (i = 0; i < cnt; i++)
        if (*(su + *(ptom + i)) == 0) number--;
    if (number == 0)printf("0");
    for (i =max,t=number; i >= 0; i--)
        if (*(su + i) != 0)
        {
            if (t != number && *(su + i) > 0) printf("+");
            if (*(su + i) == 1)
            {
                if (i == 1) printf("x", *(su + i));
                else if (i == 0) printf("%d", *(su + i));
                else printf("x%d", *(su + i), i);
            }
            else
            {
                if (i == 1) printf("%dx", *(su + i));
                else if (i == 0) printf("%d", *(su + i));
                else printf("%dx%d", *(su + i), i);
            }
            t--;
        }
    return 0;
}

运行结果:
这里写图片描述
测试结果:通过
这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值