目录
问题:
5. | 【问题描述】 一个多项式可以表示为一组数对,数对中第一个数始终为整数,且唯一,表示多项式的次数,另一数表示为对应的系数且不为0。输入两组数对,每组以0 0作为结束,实现对两个多项式的加法并按降幂输出结果数对 【输入形式】 每行输入一个数对,以空格为分隔符,以0 0结束 【输出形式】 每行输出一个数对,以空格为分隔符 【样例输入】 【样例输出】 |
分析:
样例的意思是与
的和为
,主要问题是使用哪种数据结构来存储这个数对信息,一看到数对肯定立马想到键值对容器map。正好map中的数据是按照key值升序排序,真好将key设置为次数,value设置为系数。但是还存在一个问题,给定的系数不为0,但经过相加后系数等于0改怎么办?我的处理是如果系数value对应值为0,则跳过,不输出。这道题也是练习map容器的使用。
C++STL代码:
#include <iostream>
#include <map>
using namespace std;
int main()
{
int key =0 ; //键,对应多项式次数
int value =0 ; //值,对应多项式系数
map<int,int> polynomial; //map容器,存储多项式
map<int,int>::iterator iter; //迭代器
map<int,int>::reverse_iterator reiter; //反向迭代器reverse_iterator,反向遍历map容器中的数据,它需要rbegin()(指向末尾)和rend()(指向开头)方法指出反向遍历的起始位置和终止位置。
while(1) //获取第一个多项式信息
{
cin >>key;
cin >> value;
if(0 == key && 0 == value) break; //如果key==0,value==0,则终止
iter = polynomial.find(key); //在map容器中查找是否已存在
if(iter != polynomial.end()) //如果已经存在,则修改系数
{
iter->second = iter->second + value;
}else{
polynomial[key] = value; //否则添加一个数据
}
}
while(1) //类似第一个多项式,读入第二个多项式,在读入第二个多项式时完成多项式相加
{
cin >>key;
cin >> value;
if(0 == key && 0 == value) break;
iter = polynomial.find(key);
if(iter != polynomial.end())
{
iter->second = iter->second + value;
}else{
polynomial[key] = value;
}
}
for(reiter = polynomial.rbegin(); reiter != polynomial.rend(); reiter++) //反向迭代输出数据
{
if(0 != reiter->second) //注意:只有value值!=0的时候才输出
cout << reiter->first << ' ' <<reiter->second <<endl;
}
return 0;
}
总结:
map内部自建一颗红黑树,这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,有了map容器之后会发现省了很多事,不用自己对数据重新排序,而且迭代器的使用也方便输出。map容器相对于数组的好处就是用多少内存就申请多少,不会浪费空间。