漫畫:如何實現大整數相加?

程式設計師小灰發表於2019-01-02

漫畫:如何實現大整數相加?

漫畫:如何實現大整數相加?



————— 第二天 —————



漫畫:如何實現大整數相加?

漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?



————————————



漫畫:如何實現大整數相加?

漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?



漫畫:如何實現大整數相加?



漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


在程式中列出的 “豎式” 究竟是什麼樣子呢?我們以 426709752318 + 95481253129 為例,來看看大整數相加的詳細步驟:


第一步,把整數倒序儲存,整數的個位存於陣列0下標位置,最高位存於陣列長度-1下標位置。之所以倒序儲存,更加符合我們從左到右訪問陣列的習慣。


漫畫:如何實現大整數相加?



第二步,建立結果陣列,結果陣列的最大長度是較大整數的位數+1,原因很明顯。


漫畫:如何實現大整數相加?



第三步,遍歷兩個陣列,從左到右按照對應下標把元素兩兩相加,就像小學生計算豎式一樣。


例子中,最先相加的是陣列A的第1個元素8和陣列B的第1個元素9,結果是7,進位1。把7填充到Result陣列的對應下標,進位的1填充到下一個位置:


漫畫:如何實現大整數相加?



第二組相加的是陣列A的第2個元素1和陣列B的第2個元素2,結果是3,再加上剛才的進位1,把4填充到Result陣列的對應下標:


漫畫:如何實現大整數相加?



第三組相加的是陣列A的第3個元素3和陣列B的第3個元素1,結果是4,把4填充到Result陣列的對應下標:


漫畫:如何實現大整數相加?



第四組相加的是陣列A的第4個元素2和陣列B的第4個元素3,結果是5,把5填充到Result陣列的對應下標:


漫畫:如何實現大整數相加?



以此類推......一直把陣列的所有元素都相加完畢:


漫畫:如何實現大整數相加?



第四步,把Result陣列的全部元素再次逆序,去掉首位的,就是最終結果:


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


漫畫:如何實現大整數相加?


如何優化呢?


我們之前是把大整數按照每一個十進位制數位來拆分,比如較大整數的長度有50位,那麼我們需要建立一個51位的陣列,陣列的每個元素儲存其中一位。


漫畫:如何實現大整數相加?



我們真的有必要把原整數拆分得那麼細嗎?顯然不需要,只需要拆分到可以被直接計算的程度就夠了。


int型別的取值範圍是 -2147483648——2147483647,最多有10位整數。為了防止溢位,我們可以把大整數的每9位作為陣列的一個元素,進行加法運算。(這裡也可以使用long型別來拆分,按照int範圍拆分僅僅是提供一個思路)


漫畫:如何實現大整數相加?



如此一來,佔用空間和運算次數,都被壓縮了9倍。



漫畫:如何實現大整數相加?



漫畫:如何實現大整數相加?



喜歡本文的朋友們,歡迎長按下圖關注訂閱號程式設計師小灰,收看更多精彩內容

漫畫:如何實現大整數相加?


相關文章