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

  • 相关阅读:
    #35 string(缩点+动态规划)
    BZOJ2744 HEOI2012朋友圈(二分图匹配)
    BZOJ2749 HAOI2012外星人(数论)
    BZOJ2743 HEOI2012采花(离线+树状数组)
    洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
    关于图论的一些问题模型
    洛谷 P2505 [HAOI2012]道路 解题报告
    ST表
    洛谷 P4754 True Vegetable 解题报告
    洛谷 P2053 [SCOI2007]修车 解题报告
  • 原文地址:https://www.cnblogs.com/www-helloworld-com/p/10202954.html
Copyright © 2011-2022 走看看