壓位高精度的寫法

2022-07-20 00:12:28 字數 2138 閱讀 4556

// 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 借用下貼吧裡...