现在的位置: 首页 > 综合 > 正文

PAT3-04 一元多项式的乘加

2017年08月18日 ⁄ 综合 ⁄ 共 2039字 ⁄ 字号 评论关闭
本来以为这道题挺简单的,结果一做才发现漏洞百出,学习了map 的使用,加深了stl中容器的学习和相关算法的应用
unique函数可以抽机会再用一用,实际上这些stl里面的算法可以通过自己写基础代码实现,就是指针加单纯数组加N多变量,但是太繁琐和费时间,既然已经提供了成型的算法为何不学习和应用呢?虽然这些成型的算法不太有助于对基础性知识的理解,但是你有个大概印象就可以了。
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
/* map的使用,sort 仅用于vector里面,倒序迭代器
一开始就应该结构体对象,结果还在用单纯的数组做了半天

*/
using namespace std;
//从数组转换成结构体数组
typedef struct node
{
	int coef ;
	int power;
}; // 这里声明 对象的时候还需要确认

bool comp(const node &valA,const node &valB)
{
	return (valA).power > (valB).power;
}

int main()
{
	int n,m;
	cin>> n;
	map<int,int> addMap;
	node *dataA = new node[n];
	if(n == 0)
		dataA[0].coef = dataA[0].power = 0;
	for(int i = 0;i < n;i++)
	{
		cin >> dataA[i].coef;
		cin >> dataA[i].power;
		addMap[dataA[i].power] = dataA[i].coef;//以power为键,系数为值
	}
	cin>> m;
	node *dataB = new node[m];
	if(m == 0)
		dataB[0].coef = dataB[0].power = 0;
	for(int i = 0;i < m;i++)
	{
		cin >> dataB[i].coef;
		cin >> dataB[i].power;
		if(addMap.count(dataB[i].power))//存在对应的键,加上去
			addMap[dataB[i].power] += dataB[i].coef; //map 的构建默认是按照键值的增序排序的,而不是按照你放入的先后顺序
		else
			addMap[dataB[i].power] = dataB[i].coef;
	}
	

	//乘积
	node *mulResult = new node[n*m];
	int mulLength = 0;
	for(int i = 0;i < n;i++)
	{
		for(int j = 0;j < m; j++)
		{
			mulResult[mulLength].coef = dataA[i].coef * dataB[j].coef;
			mulResult[mulLength].power = dataA[i].power + dataB[j].power;
			mulLength++;
		}
	}
	
	if(mulLength > 0)
	{
		sort(mulResult,mulResult + mulLength,comp);
		vector<node> mulResultSort(mulResult,mulResult + mulLength);
		// 可以用unique函数来实现,去掉重复的元素,返回最后一个元素迭代器
		vector<node>::iterator iter,titer;
		iter = mulResultSort.begin();
		while( iter< mulResultSort.end())
		{
			titer = iter;
			iter++;
			while( iter< mulResultSort.end()&&(*titer).power == (*iter).power)
			{
				(*titer).coef += (*iter).coef;
				(*iter).power = -1;
				iter ++;//			
			}
		}


		bool flag = false;
		for(iter = mulResultSort.begin();iter < mulResultSort.end();iter++)
		{
			if((*iter).power == -1 || (*iter).coef == 0)
				continue;
			
			if(flag)
				cout<<" ";
			
			cout<<(*iter).coef<<" "<<(*iter).power;
			flag = true;
		}
	}
	else
		cout<<"0 0";
	cout<<endl;
	//和的输出
	//倒序只要这样就可以了么。。。还要去用sort只适用于vector
	map<int,int>::reverse_iterator miter = addMap.rbegin();
		bool tag = false;
		for(;miter != addMap.rend();++miter)
		{
			if(miter->second == 0)
				continue;
			if(tag)
				cout<<" ";
			cout<<miter->second<<" "<<miter->first;
			tag = true;
			
		}
		if(!tag)
			cout<<"0 0";
		return 0;
}

			

		

	

【上篇】
【下篇】

抱歉!评论已关闭.