1. 程式人生 > >PAT甲級1002.A+B for Polynomials (25)

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

font color str 修改 col problem ack 比較 out

題目鏈接: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();
}

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