OSDN Git Service

Update bignum.md
authorCaoBowen <42204218+CBW2007@users.noreply.github.com>
Tue, 11 Dec 2018 11:05:38 +0000 (19:05 +0800)
committerGitHub <noreply@github.com>
Tue, 11 Dec 2018 11:05:38 +0000 (19:05 +0800)
docs/math/bignum.md

index 11a94e0..3ec6778 100644 (file)
@@ -6,13 +6,13 @@
 
 目录:(内容正在逐步完善)
 
--   存储
--   四则运算
--   快速幂
--   分数
--   对数(?)
--   开根
--   压位高精度
+- 存储
+- 四则运算
+- 快速幂
+- 分数
+- 对数(?)
+- 开根
+- 压位高精度
 
 还有一个很好用的[高精度封装类](https://paste.ubuntu.com/p/7VKYzpC7dn/) 10kb 想用可以自行下载。
 
@@ -231,7 +231,7 @@ char s[100024];
 
 高精度的存储其实非常简单。首先,我们读进去一个字符串,然后倒序将每一位存贮在数组内,每一位数对应一个下标。
 
-倒序存储是有原因的。当计算机读进来字符串时,第一位是最高位。为了方便计算,我们需要将最低位存储在 1 位
+倒序存储是有原因的。当计算机读进来字符串时,第一位是最高位。为了方便计算,我们需要**将最低位存储在 1 位**
 
 下面给一份 C++ 代码:
 
@@ -295,23 +295,23 @@ void plu() {
 ![](./images/multiplication.png)
 
 通过观察我们发现有如下的计算规律:
-
 $$
 c_{i+j-1}=a_i*b_j
 $$
-
 (其中,$c_{i+j-1}$代表答案的第$i+j-1$位,$a_i$代表第一个数的第 i 位,$b_j$代表第二个数的第 j 位。该公式对于任何有效的 i 和 j 均有效。)
 
 进位也比较容易:
-
 $$
 c_{i+1}=c_{i+1}+c_i \div 10,c_i=c_i\mod 10
 $$
-
 (其中,除号为整除运算)
 
-乘法运算存放数字的数组下标建议不要从 0 开始,为什么呢?因为$0+0-1=-1$,我们还需要使用另一个变量去存储 - 1 位(因为大部分编程语言都不支持负数下标)。
+**有一点需要特别注意!**
 
+如果你是不同于本文讲的读入规则(1为最低位),而是使用0作为最低位,那么计算规律就有所改变:
+$$
+c_{i+j}=a_i*b_j
+$$
 代码如下:
 
 ```c++
@@ -345,7 +345,6 @@ void mul() {
 我们发现一个特点:$a-b=-(b-a)$。
 
 举个例子:
-
 $$
 1-2=-1
 ,
@@ -353,7 +352,6 @@ $$
 ,
 -(2-1)=-1
 $$
-
 所以,我们遇到$a<b$的情况,我们需要先输出 “-” 再交换两数,接着进行减法计算。
 
 否则直接进行计算即可。