多项式加法编程题-编程练习题(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 <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容器相对于数组的好处就是用多少内存就申请多少,不会浪费空间。

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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值