PAT甲级1002.A+B for Polynomials (25)

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805526272000000

解题思路:

      由于是求两个多项式之和,并且多项式的指数是从大到小进行排列的,相加时有合并和消除的操作

因此选用了较为灵活的链表结构,将输入的第一个多项式使用链表存储起来,将第二个多项式的项依次输入,

对于加数每个项和被加数的每项的指数进行比较,如果大于其指数则插入在其前面,如果小于其指数,则比较

被加数的后一项,如果等于其指数,则将两项的系数进行相加,和为0时删除该项,和不为0时,更改其系数即可。

要求:

     熟悉链表的操作,添加、删除、和修改节点,以及头节点的作用;

大致逻辑:

     1)输入第一个多项式的项数,

     2)根据项数创建链表

     3)输入第二个多项式的项数

     4)根据项数输入节点,并把每个节点中的数据用作运算

     5)生成一个新的链表后即为和,输出链表中的数据

 

#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct LNode {
    int a;//指数
    float b;//系数
    LNode *next;//下一个结点
}LNode, *LinkList;

int main()
{
    int K1;//K1个项
    while (cin >> K1)
    {
        LinkList h = (LinkList)malloc(sizeof(LNode));//设置头节点
        h->next = NULL;
        int K3 = K1;
        LNode *r = h;
        while (K1--)
        {
            LNode *x = (LNode *)malloc(sizeof(LNode));
            cin >> x->a >> x->b;
            x->next = r->next;
            r->next = x;
            r = x;
        }
        LNode *p = h;
        LNode *q = h->next;
        int K2;
        cin >> K2;
        while (K2--)
        {
            LNode *y = (LNode *)malloc(sizeof(LNode));
            cin >> y->a >> y->b;
            while (true)
            {
                if (q == NULL)
                {
                    p->next = y;
                    y->next = q;
                    p = y;
                    K3++;
                    break;
                }
                else
                {
                    if (q->a == y->a)
                    {
                        q->b += y->b;
                        if (q->b == 0)
                        {
                            p->next = q->next;
                            q = q->next;
                            K3--;
                        }
                        else
                        {
                            p = q;
                            q = q->next;
                        }
                        break;
                    }
                    else if (q->a > y->a)
                    {
                        p = q;
                        q = q->next;
                    }
                    else
                    {
                        y->next = q;
                        p->next = y;
                        p = y;
                        K3++;
                        break;
                    }
                }
            }
        
        }
        cout << K3;
        for (r = h->next; r != NULL; r = r->next)
               printf(" %d %.1f", r->a, r->b);
        cout << endl;
    }
    system("pause");
    return 0;
}

以下摘录的代码比较简洁利落,逻辑清晰,使用了标准库中的内容,值得借鉴

#include<iostream>
#include<stdio.h>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;
 
int main()
{
    int K; pair<int, double> p;
    vector<pair<int, double> > v1,v2,v;
    cin >> K;
    for (int i = 0; i < K; i++)
    {
        cin >> p.first >> p.second;
        v1.push_back(p);
    }//把指数和系数当成一对加入到容器中,下同
    cin >> K;
    for (int i = 0; i < K; i++)
    {
        cin >> p.first >> p.second;
        v2.push_back(p);
    }
    int i = 0, j = 0;
    for (int k = 0; k < v1.size()+v2.size(); k++)
    {
        if (i < v1.size() && j < v2.size())
        {
            if (v1[i].first == v2[j].first)
            {
                p.first = v1[i].first;
                p.second = v1[i].second + v2[j].second;
                if(p.second!=0)
                v.push_back(p);
                i++; j++;
            }
            else if (v1[i].first > v2[j].first)
            {
                v.push_back(v1[i]);
                i++;
            }
            else
            {
                v.push_back(v2[j]);
                j++;
            }
        }
        else if (i < v1.size() && j >= v2.size())
        {
            v.push_back(v1[i]);
            i++;
        }
        else if (j < v2.size() && i >= v1.size())
        {
            v.push_back(v2[j]);
            j++;
        }
        else
            break;
    }//这个for循环利用二路归并排序的做法
    if (v.size()>=0)
        cout << v.size() << " ";
    else
        cout << "0";//这个地方是坑,假如说两个多项式的和为0,那么只需输出K后面无空格了
    for (int k = 0; k < v.size(); k++)
    {
        //cout << v[k].first << " " << v[k].second;
        printf("%d %.1f", v[k].first, v[k].second);//控制格式
        if (k != v.size() - 1)
            cout << " ";
    }
    v.clear(); v1.clear(); v2.clear();
}

 

posted @ 2018-07-29 09:53  hui666  阅读(138)  评论(0编辑  收藏  举报