多項式加法程式設計題-CCF-CSP程式設計練習題(100)
阿新 • • 發佈:2018-12-16
目錄
問題:
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 |
分析:
樣例的意思是與的和為,主要問題是使用哪種資料結構來儲存這個數對資訊,一看到數對肯定立馬想到鍵值對容器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容器相對於陣列的好處就是用多少記憶體就申請多少,不會浪費空間。