————— 次日 —————程序員
————————————數組
在程序中列出的 「豎式」 到底是什麼樣子呢?咱們以 426709752318 + 95481253129 爲例,來看看大整數相加的詳細步驟:優化
第一步,把整數倒序存儲,整數的個位存於數組0下標位置,最高位存於數組長度-1下標位置。之因此倒序存儲,更加符合咱們從左到右訪問數組的習慣。3d
第二步,建立結果數組,結果數組的最大長度是較大整數的位數+1,緣由很明顯。cdn
第三步,遍歷兩個數組,從左到右按照對應下標把元素兩兩相加,就像小學生計算豎式同樣。blog
例子中,最早相加的是數組A的第1個元素8和數組B的第1個元素9,結果是7,進位1。把7填充到Result數組的對應下標,進位的1填充到下一個位置:it
第二組相加的是數組A的第2個元素1和數組B的第2個元素2,結果是3,再加上剛纔的進位1,把4填充到Result數組的對應下標:io
第三組相加的是數組A的第3個元素3和數組B的第3個元素1,結果是4,把4填充到Result數組的對應下標:class
第四組相加的是數組A的第4個元素2和數組B的第4個元素3,結果是5,把5填充到Result數組的對應下標:bfc
以此類推......一直把數組的全部元素都相加完畢:
第四步,把Result數組的所有元素再次逆序,去掉首位的,就是最終結果:
如何優化呢?
咱們以前是把大整數按照每個十進制數位來拆分,好比較大整數的長度有50位,那麼咱們須要建立一個51位的數組,數組的每一個元素存儲其中一位。
咱們真的有必要把原整數拆分得那麼細嗎?顯然不須要,只須要拆分到能夠被直接計算的程度就夠了。
int類型的取值範圍是 -2147483648——2147483647,最多有10位整數。爲了防止溢出,咱們能夠把大整數的每9位做爲數組的一個元素,進行加法運算。(這裏也可使用long類型來拆分,按照int範圍拆分僅僅是提供一個思路)
如此一來,佔用空間和運算次數,都被壓縮了9倍。
喜歡本文的朋友們,歡迎長按下圖關注訂閱號程序員小灰,收看更多精彩內容