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(); }