PAT甲級1002.A+B for Polynomials (25)
阿新 • • 發佈:2018-07-29
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)