OJブラシ質問記録:1変数多項式質問番号の操作:463

1変数多項式演算問題番号:463

質問の要件:
既知の1変数多項式: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であり、リンクリストのデータフィールドには2つの値があります
。coefexp
ここで、coefは係数、expは指数です。
入力の説明
各コマンドと関連データの入力形式は次のとおりです。
入力多項式A:A、次のn行は入力される多項式、データの各行には2つの値があり、
最初の値は係数を表し、2番目の値は指数を表します。 、最初の値が0の場合、多項式Aの入力は終了します。
入力多項式B:B。次のn行は入力される多項式です。データの各行には2つの値があります。
最初の値は係数を表し、2番目の値は係数を表します。指数を表します。最初の値が0の場合、多項式Bの入力が終了します。
多項式AとBの合計を求めます。C。
入力コマンドがEの場合、プログラムは終了します。
出力の説明
入力コマンドがCの場合、出力AとB 2つの多項式の合計である出力形式は入力形式と同じです。
すべての要素が1行を占めることに注意してください。
入力例
A3
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