1002. A+B for Polynomials

This time, you are supposed to find A+B where A and B are two polynomials.

Input

Each input file contains one test case. Each case occupies 2 lines, and each line contains the information of a polynomial:K N1 aN1 N2 aN2 ... NK aNK, where K is the number of nonzero terms in the polynomial, Ni and aNi (i=1, 2, ..., K) are the exponents and coefficients, respectively. It is given that 1 <= K <= 10,0 <= NK < ... < N2 < N1 <=1000.

Output

For each test case you should output the sum of A and B in one line, with the same format as the input. Notice that there must be NO extra space at the end of each line. Please be accurate to 1 decimal place.

Sample Input
2 1 2.4 0 3.2
2 2 1.5 1 0.5
Sample Output
3 2 1.5 1 2.9 0 3.2

分析:同第一个一样,也是2个相加,但是这里是多项式相加,这道题思路很多,主要就是存储的方法有很多种,而我就用了最原始的数据结构的方法--链表,也是想复习下自己链表的知识,所以就自己用链表写出来,所以就采用了c,感觉用c++的话,可以有很多种选择。不过这题有几个需要注意的地方,如果你是部分通过的话,可以看看是不是下面的情况; 1.要注意当2个系数相加为0时,那么这一项是不需要的,如果没考虑,最后三个测试点过不去    2.就是要记得有1条链表为空了,另一条还有的情况
具体的代码中我都详细注释了,从现在开始,想开始养成注释的习惯,所以以后的代码都会详细注释清楚的

code:

#include <stdio.h>
#include <stdlib.h>

typedef struct node         //结点结构
{
    int exp;                //指数
    double coe;             //系数
    struct node *next;      //指向下一个
}Polynomial;


Polynomial* createPolynomial(Polynomial *head,int K);
Polynomial* plusPolynomial(Polynomial *a,Polynomial *b);

int main()
{
    int Ka,Kb;
    int cnt =0;
    Polynomial *a,*b,*c,*la,*lb;
    scanf("%d",&Ka);                                    //输入a链表的长度
    la=createPolynomial(a,Ka);                          //创建a链表储存a多项式
    scanf("%d",&Kb);                                    //输入b链表的长度
    lb=createPolynomial(b,Kb);                          //创建b链表储存b多项式
    c = plusPolynomial(la,lb);                          //将a,b多项式相加
    Polynomial *p;
    p=c->next;                                          //p指向c链表第一个结点
    while(p)                                            //求链表a长度
    {
        cnt ++;                                         //计数器
        p = p->next;                                    //a后移
    }
    p = c->next;                                        //p指向c链表第一个结点
    printf("%d",cnt);                                   //输出长度
    while(p)                                            //循环输出结点
    {
        printf(" %d %.1f",p->exp,p->coe);
        p = p->next;
    }
    return 0;
}

//后插法创建链表
Polynomial* createPolynomial(Polynomial *head,int K)
{
    Polynomial *p,*q;
    head = (Polynomial*)malloc(sizeof(Polynomial));     //创建头节点a
    head->next = NULL;                                  //开始链表只有一个头节点
    q = head;                                           //q指向头节点
    int i;
    for(i=0;i<K;i++)                                    //循环插入节点
    {
        p = (Polynomial*)malloc(sizeof(Polynomial));    //创立一个p结点
        double coefficients;
        int exponents;
        scanf("%d %lf",&exponents ,&coefficients);     //输入系数和指数
        p->exp = exponents;                             //存储指数
        p->coe = coefficients;                          //存储系数
        p->next = q->next;                              //将q指向的结点连接到p的后面
        q->next = p;                                    
        q = p;                                          //再将q指向p所在的结点
    }
    return head;
}

//求2个多项式相加组合到a
Polynomial* plusPolynomial(Polynomial *a,Polynomial *b)
{
    Polynomial *la,*lb,*lc,*c;
    c = (Polynomial*)malloc(sizeof(Polynomial));        //创建c链表
    la = a->next;                                       //la指向a链表第一个结点
    lb = b->next;                                       //lb指向b链表第一个结点
    lc = c;                                             //lc指向c头节点
    while(la&&lb)
    {
        if(la->exp > lb->exp)                           //当la的指数大于lb时
        {
            //将la接到lc后面
            lc->next = la;
            lc = la;
            la =la->next;
        }
        else if(la->exp == lb->exp)                     //当la的指数大于lb时
        {

            la->coe = la->coe + lb->coe;                //系数求和
            /*这里特别注意要考虑当2个系数相加为0时,那么就不能加到c中*/
            if(la->coe!=0)                              //系数不为0时
            {
                Polynomial *p;
                // la接到lc后面,la后移,lb后移,删除原来的lb结点
                lc->next = la;                          
                lc = la;
                la = la->next;
                p = lb;
                lb = lb->next;                               //lb指针后移
                free(p);                                     //删除p结点
            }
            else
            {
                Polynomial *m,*n;
                //la,lb都后移,删除la,lb原来所在的结点
                m = la;
                la = la->next;
                lc->next = m ->next;
                free(m);
                n = lb;
                lb = lb->next;
                free(n);
            }
        }
        else                                                //当la<lb时
        {
            //将lb接到lc后面
            lc->next = lb;
            lc = lb;
            lb =lb->next;
        }
    }
    /*这里也要注意一下,前面的没有考虑当2条链表中的一条已经为空时,所以还需考虑这种情况*/
    if(la)
    {
        lc->next = la;
    }
    if(lb)
    {
        lc->next = lb;
    }
    return c;
}

=====================================================================================================

坚持,继续修行微笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值