// 2020/06/10 修正 html 原始碼
// 2021/12/25 發現這篇隨筆閱讀量破千了,二次修正 html 原始碼,並做了相關補充
壓位高精度的寫法
對於單位高精度演算法,那麼有沒有可以加速、節省空間的做法呢?
顯然是有的。
以前,存數字陣列裡面只存著乙個數字,所以加減都是一位一位地加,進製也是一位一位地實現。
所以,我們嘗試著將數字序列從一位變成多位。
比如高精度加法:
所以,如果我們壓八位(保證 ll 存的下的情況),那麼時空複雜度的常數是 $\frac$。
如,計算:$13134987124987+192837918479$。
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 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
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$。
13 1349 8712 4987+ 1928 3791 8479
13 1349 8712 4987+ 1928 3791 8479————————————————————————————————
13 3277 12503 13466
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$ 填充,不然結果將出現前導 $0$。
所以比較好的做法,是先輸出第乙個數,再按照如上填充方式輸出。
壓位高精度在某些運算中會極大提高程式效率,比如高精度乘法。
題目:給定兩個大正整數 $a,b$,輸出 $a \times b$ 的值。
範圍:$1 \le a,b \le 10^$。
若我們使用普通高精度,那麼根據乘法分配率,我們要兩兩枚舉 $a,b$ 的每一位並進行乘法,最後進製。
這麼做的運算次數時 $50000^2$ 級別的,不優秀。
但如果我們壓位(以壓 $9$ 位為例),那麼我們相當於把這個數字看作 $10^9$ 進製的數字,在這個進製下該數的位數最多為 $\frac$。
然後可以對每個 $10^9$ 進製的數字兩兩運算,複雜度就降為 $\frac$,是原來的幾十分之一,在某些題目就能過掉更多的資料。
當然注意一些細節:
壓位高精度模板
原先是整型陣列每個元素存1個數字,壓位高精是每位存8個數字,這樣可以加速8唄,空間也減小了。可謂是對整形陣列的充分利用。include include include include include include include include include include include in...
壓位高精度模板
不走程式,直接上板子。第乙個板子壓四位,支援帶符號的加減乘。第二個板子壓九位,支援不帶符號的四則運算和取模。都封裝了。include include include using namespace std struct intx bool operator const intx b const bo...
Ural 1803(數學,高精度,壓位)
2015 03 01 21 20 58 思路 這題的題意,簡而言之就是給你n和k,讓你求出前n個斐波那契數的各個數字上的數的和,進行排序後輸出。考慮,首先k的範圍2 10,沒有問題,但是n最大可達到50000,而斐波那契數的增長非常快,40 就能爆int。所以要高精度 壓位 不壓位會t 借用下貼吧裡...