杭電OJ 部分題目解法即思路
一、前言
不知不覺已經大三上學期了,可作為一個計算機狗還沒有考過CCF-CSP。因平時學習內容主要與安全方面相關,對於此類演算法類的考核並沒有太多的準備,故打算開始刷題複習演算法和資料結構,準備衝擊2020年12月的CCF認證。雖然平時在學校裡使用java語言較多,但考慮到語言執行速度和編譯器的熟練程度,以及網路上對於OJ題目的解法大多為c/c++編寫,故此次打算報名c/c++作為編寫語言。因此筆者在解題過程中可能會較多使用STL,並對其功能進行一些講解。
二、題解
1002、A + B Problem II
此題依據要求,是很常見的使用字串解決加法問題,這裡要對字元的運算有一定認識,即兩個字元的加減運算即為其ASCII碼的加減運算,其中字元‘0’的ASCII碼為48,以此類推。
思路:將兩個需要進行加法運算的數A,B,分別用字串s1,s2儲存,再對s1,s2從低位到高位依次進行加法運算,同時設定標誌位flag,表示是否進位。在此題中有一個問題就是,將依次加法運算得到的數放到儲存結構中後,在輸出時需要逆向輸出,才是真正的運算結果,這裡可以使用字串來儲存結果,但考慮到“先進後出”的特徵,我們使用棧結構stack來儲存依次得到的資料。
關於棧stack:
包括在stack標頭檔案中,使用時需要#include<stack>
功能如下:
(1)建構函式:
stack(class T,class Container = deque<T>):建立元素型別為T的空棧,預設容器為deque。
也可以直接使用:stack<ElemType>name 建立型別為ElemType的棧name
(2)操作函式:
bool empty():如果棧為空返回true,否則返回false;
int size():返回棧中元素個數;
void push(const T& t):把元素t壓入棧頂;
void pop():當棧非空的情況下,刪除棧頂元素;
T& top():當棧非空的情況下,返回棧頂元素。
題解程式碼:
#include<iostream> #include<string> #include<stack> using namespacestd; int main(void){ string s1; //第一個數 string s2; //第二個數 int T = 0; //總的case數 cin>>T; int count = 1; while(count<=T){ cin>>s1>>s2; stack<char>s; int l1 = s1.length(); int l2 = s2.length(); int maxl = l1; int flag = 0; //進位標誌,如果進位則為1,否則為0 if(l1>=l2){ maxl = l1; string s3(l1-l2,'0'); s3 = s3 + s2; for(int i=maxl-1;i>=0;i--){ int now = s1[i] + s3[i] + flag - 96; if(now>=10){ now = now - 10; flag = 1; } else flag = 0; s.push(now + 48); } if(flag == 1) s.push('1'); } else if(l1<l2){ maxl = l2; string s3(l2-l1,'0'); s3 = s3 + s1; for(int i=maxl-1;i>=0;i--){ int now = s2[i] + s3[i] + flag - 96; if(now>=10){ now = now - 10; flag = 1; } else flag = 0; s.push(now + 48); } if(flag == 1) s.push('1'); } int len = s.size(); cout<<"Case "<<count<<":"<<endl; cout<<s1<<" + "<<s2<<" = "; for(int j=0;j<len;j++){ cout<<s.top(); s.pop(); } if(count!=T) cout<<endl<<endl; else cout<<endl; count++; } return 0; }
-----待更新-------