数据结构与算法——多项式加法


描述

    我们经常遇到两多项式相加的情况,在这里,我们就需要用程序来模拟实现把两个多项式相加到一起。首先,我们会有两个多项式,每个多项式是独立的一行,每个多项式由系数、幂数这样的多个整数对来表示。

如多项式2x20- x17+ 5x9- 7x7+ 16x5+ 10x4 + 22x2- 15

对应的表达式为:2 20 -1 17 5 9 - 7 7 16 5 10 4 22 2 -15 0。  

为了标记每行多项式的结束,在表达式后面加上了一个幂数为负数的整数对。

同时输入表达式的幂数大小顺序是随机的。

我们需要做的就是把所给的两个多项式加起来。

输入输入包括多行。
第一行整数n,表示有多少组的多项式需要求和。(1 < n < 100)
下面为2n行整数,每一行都是一个多项式的表达式。表示n组需要相加的多项式。
每行长度小于300。输出输出包括n行,每行为1组多项式相加的结果。
在每一行的输出结果中,多项式的每一项用“[x y]”形式的字符串表示,x是该项的系数、y 是该项的幂数。要求按照每一项的幂从高到低排列,即先输出幂数高的项、再输出幂数低的项。
系数为零的项不要输出。


解题思路是首先读入数据,按幂次大小排列,然后合并相同幂次的项,最后删除系数为0的项,注意事项是可能合并后才出现系数为0的项,故后两步相对独立。


#include 
#include "iostream"
using namespace std;

struct Pair{
	int a;
	int b;
};

int main()
{
	int n;
	cin >> n;
	for (int i = 0;i < n;i++) {
		vector ps;
		int tempa, tempb, count = 0;
		while (count < 2) {
			cin >> tempa >> tempb;
			if (tempb >= 0) {
				Pair p;
				p.a = tempa;
				p.b = tempb;
				ps.push_back(p);
			}
			else {
				count++;
				//cin.ignore(300, '\n');
			}
		}
		int len = ps.size();
		for (int j = 0;j < len - 1;j++) {
			for (int k = j + 1;k < len;k++) {
				if (ps[j].b < ps[k].b) {
					Pair temp = ps[k];
					ps[k] = ps[j];
					ps[j] = temp;
				}
			}
		}
		for (int j = 0;j < len - 1;j++) {
			if (ps[j].b == ps[j + 1].b) {
				ps[j].a += ps[j + 1].a;
				ps.erase(ps.begin() + j + 1);
				len--;
				j--;
			}
		}

		len = ps.size();
		for (int j = 0;j < len;j++) {
			if (ps[j].a == 0) {
				ps.erase(ps.begin() + j);
				len--;
				j--;
			}
		}

		for (int j = 0;j < ps.size();j++) {
			cout << "[ " << ps[j].a << ' ' << ps[j].b << " ] ";
		}
		cout << endl;
	}
    return 0;
}



借鉴别人的用map类可省去冒泡排序的步骤


#include 
#include 
#include 
using namespace std;

int main() {
	int n;
	cin >> n;
	for (int i = 0; i != n; ++i) {
		map  ploy;
		int index, value, over = 0;
		while (cin >> value >> index) {
			if (index < 0)
				over++;
			else {
				pair ::iterator, bool> ret =
					ploy.insert(make_pair(index, value));
				if (!ret.second)
					ret.first->second += value;
			}
			if (over == 2)
				break;
		}
		for (map ::reverse_iterator riter = ploy.rbegin();
		riter != ploy.rend(); ++riter) {
			if (riter->second != 0)
				cout << "[ " << riter->second << ' ' << riter->first << " ] ";
		}
		cout << endl;
	}
	return 0;
}


你可能感兴趣的:(poj练习)