多项式乘法和加法

原题:https://pintia.cn/problem-sets/15/problems/710
题目要求:
在这里插入图片描述
这个题目我写了很久,看到的第一眼就是用pair和vector或者list来创建一个式子,然后我又看了看题目发现要求排序,我就用了list因为list可以有一个自定义的排序,用pair的第一个数表示式子的系数,第二个表示指数。我写了很久才完成了加法。
//bool compare(pair<int, int>&p1, pair<int, int>&p2)
//{
// return p1.second > p2.second;//按照指数降序排列
//}
//void Plus(list<pair<int, int>>l1, list<pair<int, int>>l2)
//{
// for (list<pair<int, int>>::iterator it = l1.begin(); it != l1.end(); it++)
// {
// for (list<pair<int, int>>::iterator IT = l2.begin(); IT != l2.end(); )
// {
// if ((*it).second == (*IT).second)
// {
// (*it).first += (*IT).first;
// l2.erase(IT++);
// continue;
// }
// IT++;
// }
// }
// for (list<pair<int, int>>::iterator IT = l2.begin(); IT != l2.end(); IT++)
// {
// l1.push_back((*IT));
// }
//
// l1.sort(compare);
//
// for (list<pair<int, int>>::iterator it = l1.begin(); it != l1.end(); it++)
// {
// cout << (*it).first << " " << (*it).second << " ";
// }
//}

void Plus(vector<pair<int, int>>v1, vector<pair<int, int>>v2)
{
for (int i = 0; i < v2.size(); i++)
{
v1.push_back(v2[i]);
}
Sort(v1);
}
以上是list实现加法的主要函数

后来我发现这个题目主要是能够将多项式合并,就是把加法或乘法算出来的式子保存到一个vector或者list中然后合并同类项就可以完成了。所以需要遍历list或vector。我最开始是用的list但是由于list的数据不是连续的遍历的时候总是有问题,因为我遍历的过程中会删除一些节点导致遍历过程出现错误。

后来我又使用了vector来遍历但是结果还是有点问题不过我已经不知道要怎么修改了。这里提供了一些思路,对读者有帮助。
在这里插入图片描述

#include
#include
#include
using namespace std;

void Sort(vector<pair<int, int>>v)
{
vector<pair<int, int>> v1;
for (int i = 0; i < v.size(); i++)
{
for (int j = i + 1; j < v.size(); j++)
{
if (v[i].second == v[j].second)
{
v[i].first += v[j].first;
if (v[i].first == 0)
{
v[i].second = 0;
}
vector<pair<int, int>>::iterator it = v.begin() + j;
v.erase(it);
}
}
}

for (int i = 0; i < v.size()-1; i++)
{
	for (int j = 0; j < v.size() - i - 1; j++)
	{
		if (v[j].second < v[j + 1].second)
		{
			pair<int, int> p = v[j];
			v[j] = v[j + 1];
			v[j + 1] = p;
		}
	}
}
int i;
for (i = 0; i < v.size()-1; i++)
{
	/*if (v[i].first == 0)
	{
		continue;
	}*/
	cout << v[i].first << " " << v[i].second << " ";
}
cout << v[i].first << " " << v[i].second;
/*if (v[i].first != 0)
{
	cout << v[i].first << " " << v[i].second;
}*/

}

void Mult(vector<pair<int, int>>v1, vector<pair<int, int>>v2)
{
vector<pair<int, int>> v;
pair<int, int> p;
for (int i = 0; i < v1.size(); i++)
{
for (int j = 0; j < v2.size(); j++)
{
p = make_pair(v1[i].first * v2[j].first, v1[i].second + v2[j].second);
v.push_back§;
}
}

Sort(v);

}

int main()
{

vector<pair<int, int>> v1;
vector<pair<int, int>> v2;
pair<int, int>p;
int c, x, s;
cin >> s;
for (int i = 0; i < s; i++)
{
	cin >> c >> x;
	p = make_pair(c, x);
	v1.push_back(p);
}
cin >> s;
for (int i = 0; i < s; i++)
{
	cin >> c >> x;
	p = make_pair(c, x);
	v2.push_back(p);
}
Mult(v1, v2);
cout << endl;
Plus(v1, v2);
/*vector<pair<int, int>> v;
pair<int, int>p;
int c, x, s;
cin >> s;
for (int i = 0; i < s; i++)
{
	cin >> c >> x;
	p = make_pair(c, x);
	v.push_back(p);
}
Sort(v);*/
return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值