多项式加法编程题-编程练习题(100)

目录

问题:

分析:

C++STL代码:

总结:


问题:

5.

【问题描述】

一个多项式可以表示为一组数对,数对中第一个数始终为整数,且唯一,表示多项式的次数,另一数表示为对应的系数且不为0。输入两组数对,每组以0 0作为结束,实现对两个多项式的加法并按降幂输出结果数对

【输入形式】

每行输入一个数对,以空格为分隔符,以0 0结束

【输出形式】

每行输出一个数对,以空格为分隔符

【样例输入】

5 12
3 8
1 2
15 5
0 10
0 0
3 12
30 1
15 5
0 0

【样例输出】

30 1
15 10
5 12
3 20
1 2
0 10

分析:

样例的意思是12x^{5}+8x^{3}+2x^{1}+5x^{15}+10x^{0}12x^{3}+1x^{30}+5x^{15}的和为1x^{30}+10x^{15}+12x^{5}+20x^{3}+2x^{1}+10x^{0},主要问题是使用哪种数据结构来存储这个数对信息,一看到数对肯定立马想到键值对容器map。正好map中的数据是按照key值升序排序,真好将key设置为次数,value设置为系数。但是还存在一个问题,给定的系数不为0,但经过相加后系数等于0改怎么办?我的处理是如果系数value对应值为0,则跳过,不输出。这道题也是练习map容器的使用。

C++STL代码:

#include 
#include 

using namespace std;

int main()
{
    int key =0 ;                            //键,对应多项式次数
    int value =0 ;                          //值,对应多项式系数
    map polynomial;                //map容器,存储多项式
    map::iterator iter;            //迭代器
    map::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 << ' ' <second <

总结:

map内部自建一颗红黑树,这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,有了map容器之后会发现省了很多事,不用自己对数据重新排序,而且迭代器的使用也方便输出。map容器相对于数组的好处就是用多少内存就申请多少,不会浪费空间。

转载于:https://www.cnblogs.com/www-helloworld-com/p/10202954.html

你可能感兴趣的:(多项式加法编程题-编程练习题(100))