1. 程式人生 > >多項式加法程式設計題-CCF-CSP程式設計練習題(100)

多項式加法程式設計題-CCF-CSP程式設計練習題(100)

目錄

問題:

分析:

總結:

問題:

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容器相對於陣列的好處就是用多少記憶體就申請多少,不會浪費空間。