// 2020/06/10 修正 HTML 代碼
壓位高精度的寫法
之前有單位高精度算法,那么有沒有可以加速、節省空間的做法呢?
有!
以前,存數字數組里面只存着一個數字,所以加減都是一位一位地加,進位也是一位一位地實現。
所以,我們嘗試着將數字序列從一位變成多位。
比如高精度加法:
如果壓兩位,我們就兩位兩位地存數字,運算時依然可以正常相加,但是相加的次數減半了;
進位時,只需要將進位的數字除以 $10^2$,加到下一位就可以了。
所以,如果我們壓八位(保證 LL 存的下的情況),那么時空復雜度的常數是 $\frac{1}{8}$。
如,計算:$13134987124987+192837918479$。
傳統做法:
Step 1: 分離數位
1 3 1 3 4 9 8 7 1 2 4 9 8 7 + 1 9 2 8 3 7 9 1 8 4 7 9
Step 2: 每位相加
1 3 1 3 4 9 8 7 1 2 4 9 8 7
+ 1 9 2 8 3 7 9 1 8 4 7 9
————————————————————————————————————————————
1 3 2 12 8 17 11 14 10 3 12 13 15 16
Step 3: 進位
1 3 1 3 4 9 8 7 1 2 4 9 8 7
+ 1 9 2 8 3 7 9 1 8 4 7 9
————————————————————————————————————————————
1 3 3 2 7 8 2 5 0 4 3 4 6 6
所以答案為 $13327825043466$。
壓位做法(壓 $4$ 位):
Step 1: 分離數位
13 1349 8712 4987 + 1928 3791 8479
Step 2: 相加
13 1349 8712 4987
+ 1928 3791 8479
————————————————————————————————
13 3277 12503 13466
Step 3: 進位
13 1349 8712 4987
+ 1928 3791 8479
————————————————————————————————
13 3278 2504 3466
所以答案為 $13327825043466$,和上面答案一樣
排坑
我們發現,有些數位進位之后會發生一些意想不到的結果:
例子:1598 + 9144
我們如果壓 4 位,結果是:
1598
+ 9144
————————————————
1 0472
但是,這個 0472 如果直接輸出,是 472,於是就 WA 了。
所以可以這么寫:
printf("%.4d", a);
這句話的作用是如果 a 不到 4 位就把不到的位用 0 填充后輸出。
但是,又有一個坑:
最高位所在的那段不能用 $0$ 填充 。
所以比較好的做法,是先輸出第一個數,再按照如上填充方式輸出。
壓位高精度在乘法等復雜度較高的運算會有很大用處。