1. 簡介
我們知道現代的計算機大多數都是64
位的,因此能處理最大整數為 2 64 ? 1 2^{64}-1 264?1。那如果是超過了這個數怎么辦呢,那就需要我們自己手動模擬數的加減乘除了。
2. 思路
我們可以用一個數組來存儲大數,數組中的每一個位置表示一個數位。為了方便,我們直接用 S T L STL STL中的vector
來存。
2.1 大數加法
我們需要把兩個大數的最低位對齊,然后再開始相加。唯一需要注意的是處理一下最高位置的進位置。
2.2 大數減法
大數減法跟加法不一樣的是,我們需要處理相減后的前導0,因為有可能出現相減為0的情況。處理前導0只需要從最高位開始到第2位的連續0。
2.3 大數乘法
大數乘法與加法不同的是,每次相乘后放到相應的位置而不是相乘的位次本身。
2.4 大數除法
大數除法是最難的,我們用減法進行模擬。
假設兩個大數為 a b a\ b a?b, a a a為除數, b b b為被除數。
我們每次需要找到最接近被除數的除數的進制次倍數 m m m:
D 0 : = { d : a × 1 0 d ≤ b } d 0 = max ? { D 0 } m 0 = a × 1 0 d 0 D_0 := \{d: a\times 10^d \le b\}\\ d_0 =\max \{D_0\}\\ m_0=a \times 10^{d_0} D0?:={d:a×10d≤b}d0?=max{D0?}m0?=a×10d0?
通過大數減法算出 t 0 = ? b / m 0 ? t_0 =\lfloor b/m_0 \rfloor t0?=?b/m0??, 因此商需要加上 a n s = a n s + t 0 1 0 d 0 ans = ans +t_010^{d_0} ans=ans+t0?10d0?。
此時余數為 b 1 b_1 b1?,如果 b 1 < a b_1<a b1?<a,說明我們的除法做完了,否則令 b = b 1 b=b_1 b=b1?, 繼續重復上面的過程直到 b k < a b_k <a bk?<a。
2.5 符號問題
我們在加減乘除的時候,
可以將符號問題單獨考慮。
因此可以寫一個絕對值的大數相加,還有一個版本
的一個大的大數減一個小的大數的大數減法。
而至于乘除法的符號問題比較容易處理,因此可以
一同處理符號的問題。
3. 實現
放在gitee上了。
4. TODO
- 更加豐富的測試樣例
- 加減乘除未兼容普通整數
- 大數除法中的負數的商不是最小非負余數