今天看到一個算法題,就是如果有兩個大整數求和,但是這兩個大整數的取值范圍超過了計算機能表示的范圍,要怎么辦?
正好之前看了線性表的順序存儲結構,覺得可以將大整數的每一位存儲到數組中,然后對數組進行對應位的計算!線性表的順序存儲結構的
實現可以看我的前面的博客,有介紹。現在要寫一個大整數求和的算法,即用兩個線性表進行相加,所以要將這個算法函數聲明為順序表類的友元函數,
以此來讀取類的私有成員!具體實現如下:
template<class T>// 定義模板類 class SeqList { public: ... SeqList(int a, int n); // 有參構造函數,通過大整數建立一個長度為n的順序表 ... friend SeqList<T> Add(SeqList<T> &A, SeqList<T> &B);// 大整數求和算法 private: T data[MaxSize]; int Length; }; // 構造函數,將大整數的每一位存到數組中,數組低位放置整數的高位 template<class T> inline SeqList<T>::SeqList(int a, int n) { for (int i = n - 1; i >= 0; i--) { data[i] = a % 10; a /= 10; } Length = n; } // 具體算法 ,結果放入表A中 template<class T> SeqList<T> Add(SeqList<T> &A, SeqList<T> &B) { int flag = 0; // 進位標記 int i = 0; // 位數 int n = A.Length; int m = B.Length; while (i < n && i < m) { A.data[i] = (A.data[i] + B.data[i] + flag) % 10; // 計算第i位的值 flag = (A.data[i] + B.data[i] + flag) / 10; // 計算第i位的進位 i++; } // 計算大整數A余下的部分 for (; i < n; i++) { A.data[i] = (A.data[i] + flag) % 10; flag = (A.data[i] + flag) / 10; } // 計算大整數B余下的部分 for (; i < m; i++) { A.data[i] = (B.data[i] + flag) % 10; flag = (B.data[i] + flag) / 10; } int d = (n > m) ? n : m; if (flag == 1) { A.data[d] = 1; A.Length=d+1; } return A; } int main() { int a = 12345678; int b = 123456789; SeqList<int> aa(a,8);// 模板類實例化 SeqList<int> bb(b,9); SeqList<int> D=Add(aa, bb); D.printlist(); system("pause"); return 0; }
寫完編譯,出錯!
感覺寫的很對,怎么錯了呢??找錯吧。。。
於是百度找資料,翻一翻C++ primer,終於發現問題:
函數Add並不是一個模板函數,而下面卻用模板函數定義
於是進行修改,修改如下:
template<class T>// 定義模板類 class SeqList { public: ... SeqList(int a, int n); // 有參構造函數,通過大整數建立一個長度為n的順序表 ... template<class T> friend SeqList<T> Add(SeqList<T> &A, SeqList<T> &B);// 大整數求和算法 private: T data[MaxSize]; int Length; };
如上修改之后,順利通過編譯!
運行結果如下:
結果正確。