壓位高精度的寫法


// 2020/06/10 修正 HTML 代碼

壓位高精度的寫法

  之前有單位高精度算法,那么有沒有可以加速、節省空間的做法呢?

  有!

  以前,存數字數組里面只存着一個數字,所以加減都是一位一位地加,進位也是一位一位地實現。

  所以,我們嘗試着將數字序列從一位變成多位。

  比如高精度加法:

  如果壓兩位,我們就兩位兩位地存數字,運算時依然可以正常相加,但是相加的次數減半了;

  進位時,只需要將進位的數字除以 $10^2$,加到下一位就可以了。

  所以,如果我們壓八位(保證 LL 存的下的情況),那么時空復雜度的常數是 $\frac{1}{8}$。

  如,計算:$13134987124987+192837918479$。

  傳統做法:

  Ste1: 分離數位

  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

 

  Ste2: 每位相加

  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

 

  Ste3: 進位

  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$ 填充 

  所以比較好的做法,是先輸出第一個數,再按照如上填充方式輸出。


  壓位高精度在乘法等復雜度較高的運算會有很大用處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM