OJ刷题记录:一元多项式的运算 题目编号:463

一元多项式的运算 题目编号:463

题目要求:
已知一元多项式: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

解题思路:
。。。

通关代码:

#include <iostream>

using namespace std;

struct Node {
    
    
	int _coef;
	int _exp;
	Node* _next;
	Node(int coef, int exp):_coef(coef), _exp(exp), _next(NULL) {
    
    }
};

class Polynomial {
    
    
	public:
		Polynomial();
		~Polynomial();

	public:
		void Insert(int coef, int exp);
		void Print();
		Node* getHead();

	private:
		Node* head_;
		Node* rear_;
};

Polynomial::Polynomial() {
    
    
	head_ = new Node(0, 0);
	rear_ = head_;
}

Polynomial::~Polynomial() {
    
    
	Node* afterHead = NULL;

	for (Node* p = head_; p != NULL; p = afterHead) {
    
    
		afterHead = p->_next;
		delete p;
	}
}

void Polynomial::Insert(int coef, int exp) {
    
    
	Node* node = new Node(coef, exp);

	rear_->_next = node;
	rear_ = node;
}

void Polynomial::Print() {
    
    
	for (Node* p = head_->_next; p != NULL; p = p->_next) {
    
    
		cout << p->_coef << ' ' << p->_exp << endl;
	}
}

Node* Polynomial::getHead() {
    
    
	return head_;
}

void getResToA(Polynomial &A, Polynomial &B) {
    
    
	Node* previousA = A.getHead();
	Node* previousB = B.getHead();
	Node* pA = previousA->_next;
	Node* pB = previousB->_next;
	Node* temp = NULL;
	
	while (pA != NULL && pB != NULL) {
    
    
		if (pA->_exp < pB->_exp) {
    
    
			previousA = pA;
			pA = pA->_next;
		} else if (pA->_exp > pB->_exp) {
    
    
			temp = pB->_next;
			previousA->_next = pB;
			pB->_next = pA;
			previousA = pB;
			pB = temp;
			previousB->_next = pB;
		} else {
    
    
			pA->_coef = pA->_coef + pB->_coef;
			if (pA->_coef == 0) {
    
    
				previousA->_next = pA->_next;
				delete pA;
				pA = previousA->_next;
			} else {
    
    
				previousA = pA;
				pA = pA->_next; 
			}
			previousB->_next = pB->_next;
			delete pB;
			pB = previousB->_next;
		}
	}
	if (pB != NULL) previousA->_next = pB;
}

int main() {
    
    
	Polynomial A, B;
	char key;
	int coef, exp;

	while (cin >> key) {
    
    
		if (key == 'E') break;

		switch (key) {
    
    
			case 'A':
				while (true) {
    
    
					cin >> coef >> exp;
					if (coef == 0) break;
					A.Insert(coef, exp);
				}
				break;

			case 'B':
				while (true) {
    
    
					cin >> coef >> exp;
					if (coef == 0) break;
					B.Insert(coef, exp);
				}
				break;

			case 'C':
				getResToA(A, B);
				A.Print();
				break;
		}
	}

	return 0;
}

毕。

猜你喜欢

转载自blog.csdn.net/weixin_45711556/article/details/108855722