zoukankan      html  css  js  c++  java
  • 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();
    }
  • 相关阅读:
    使用openURL实现程序间带参数跳转详解
    [翻译] DFCircleActivityIndicator DF圆形活动状态指示器
    ABC定制视图导航控制器
    [翻译] UIView-draggable 可拖拽的UIView
    [翻译] SFRoundProgressCounterView 带有进度显示的倒计时视图
    [翻译] ColourClock 将时间值转换成背景色
    Solr部署如何启动
    搜索引擎基本工作原理
    面试题 IQ
    解释一下,在你往浏览器中输入一个URL后都发生了什么,要尽可能详细
  • 原文地址:https://www.cnblogs.com/denghui666/p/9383877.html
Copyright © 2011-2022 走看看