[D-OJ练习] 一元多项式的运算
已知一元多项式:A(x)=a0+a1x+a2x2+a3x3+….anxn, B(x)= b0+b1x+b2x2+b3x3+….bmxm设计算法实现C(x)=A(x)+B(x)。功能包括输入多项式A,输入多项式B,求A和B的和,显示求和后的结果等操作。本题中,链表的第一个元素位置为1,链表的数据域格式为
coef | exp |
其中coef为系数,exp为指数。
输入描述
各个命令以及相关数据的输入格式如下: 输入多项式A:A,接下来的n行是要输入的多项式,每一行数据有两个值, 第一个值代表系数,第二个值代表指数,当第一个值为0时,多项式A输入结束 输入多项式B:B,接下来的n行是要输入的多项式,每一行数据有两个值, 第一个值代表系数,第二个值代表指数,当第一个值为0时,多项式B输入结束 求多项式A和B的和:C 当输入的命令为E时,程序结束
输出描述
当输入的命令为C时,请输出A和B两个多项式的和,输出格式与输入格式相同 注意,所有的元素均占一行
输入样例
A 3 1 1 2 -1 10 4 12 -1 100 0 1 B -4 0 1 1 -3 2 1 6 -1 9 10 12 1 100 0 1 C E
输出样例
-4 0 4 1 -2 2 1 6 -1 9 -1 10 14 12
利用STL的写法(OJ不给力的话不给过,但写法本身无问题):
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<pair<int, int>> s;
char ch;
int coef,ex;
while ((cin>>ch) && ch != 'E')
{
switch(ch)
{
case 'A':
case 'B':
while((cin>>coef>>ex) && coef )
{
s.push_back({ex,coef});
}
break;
case 'C':
sort(s.begin(),s.end());
int a=0,b=0;
int cnt=1;
for(auto item : s)
{
if(cnt==1){
a = item.second;//系数
b = item.first;//指数
}else{
if(item.first != b){
if(a != 0){
cout << a << ' ' << b ;
}
a = item.second; //更新
b = item.first;
}else{
a += item.second;
}
}
cnt++;
}
break;
}
}
return 0;
}
利用链表(朴实写法)
#include<iostream>
using namespace std;
struct Node
{
int coef;
int exp;
Node* next;
Node(int c,int e):coef(c),exp(e),next(NULL){}
};
void NodeRank(Node* head)//直插排序
{
Node* p = head->next;
Node* pre = NULL, * q = NULL;
if (p == NULL) {
return;
}
p = p->next;
head->next->next = NULL;
while (p)
{
q = p->next;
pre = head;
while (pre->next && pre->next->exp <= p->exp)
{
pre = pre->next;
}
p->next = pre->next;
pre->next = p;
p = q;
}
}
int main()
{
Node* head = new Node(0,0);
Node* p = head;
Node* newNode;
char ch;
int coef, exp;
while ((cin >> ch) && ch != 'E')
{
switch (ch)
{
case 'A':
case 'B':
while ((cin >> coef >> exp)&&coef)
{
newNode = new Node(coef, exp);
p->next = newNode;
p = newNode;
}
break;
case 'C':
NodeRank(head);
int a = 0, b = 0;
int cnt = 1;
p = head;
while(p)
{
if (cnt == 1) {
a = p->coef;//系数
b = p->exp;//指数
}
else {
if (p->exp != b) {
if (a != 0) {
cout << a << ' ' << b ;
}
a = p->coef; //更新
b = p->exp;
//ret=1;
}
else {
a += p->coef;
}
}
cnt++;
p = p->next;
}
if(a!=0){
cout << a << ' ' << b ;
}
break;
}
}
return 0;
}
本文来自博客园,作者:泥烟,CSDN同名, 转载请注明原文链接:https://www.cnblogs.com/Knight02/p/15799103.html