高精度计算
高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型(int),超长整形(long long )、实型(float/double))能表示的范围的运算。
高精度算法
高精度算法,属于处理大数字的数学计算方法。在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字。一般这类数字我们统称为高精度数,高精度算法是用计算机对于超大数据的一种模拟加,减,乘,除,乘方,阶乘,开方等运算。对于非常庞大的数字无法在计算机中正常存储,于是,将这个数字拆开,拆成一位一位的,或者是四位四位的存储到一个数组中,
用一个数组去表示一个数字,这样这个数字就被称为是高精度数。高精度算法就是能处理高精度数各种运算的算法,但又因其特殊性,故从普通数的算法中分离,自成一家。
operator
operator是C++和pascal的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。
基本原理
加减乘除的基本原理与小学时学的竖式计算几乎无异,通过简单的模拟竖式计算实现。
例子:
加法:
A[2]:5 A[1]:3 A[0]:1
+ B[2]:5 B[1]:3 B[0]:1
-----------------------------------------------------
Ans[3]:1 Ans[2]:0 Ans[1]:6 Ans[0]:2
减法:
A[2]:5 A[1]:3 A[0]:1
- B[2]:2 B[1]:1 B[0]:0
-----------------------------------------------------
Ans[2]:3 Ans[1]:2 Ans[0]:1
乘法:
A[1]:1 A[0]:2
+ B[1]:1 B[0]:2
-----------------------------------------------------
Ans[1 + 0]:+2 Ans[0 + 0]:+4 (
Ans[1 + 1]:+1 Ans[0+ 1]:+2 (
-----------------------------------------------------
Ans[2]:1 Ans[1]:4 Ans[0]:4
详细实现
数字的存储&&读入&&输出
很显然,我们存数时肯定不能用标准数据类型存储,那我们怎么办??
因为高精度数的运算就是简单的模拟竖式计算,而竖式计算时我们是一个数位一个数位的计算,那我们把一个高精度数看成N个数字就行了,用一个数组存。
负数怎么办??
开个
bool
做标记。不过还有别的方法。我们观察例子时会发现,数组下表是从0开始的,这是为什么??
方便乘法时算数位,自己可以手动模拟一下。但是读入,输出,去多余的0是稍微需要绕一下。
我们观察例子时会发现,数组下标小的存的是数位大的,这是为什么呢??
竖式计算时,我们从小到大进行计算,但面临进位时,如果按照输入顺序,即从高位到低位存,那么我们就需要向数组[数组下表的前一位(-1)]加一个数,但当前数组下标是0时,那么我们就需要加一个数到数组[-1],但是在C++中数组下标不能为负,而且数组下标大的存的是数位小的,那我们就要从数组下表大的往数组下标小的运算,所以会很变扭。但我们将倒着存时就不会面临这个问题。
进位和退位
我们进位时有两种操作方法,一是在运算过程中考虑进位,二是在运算结束后考虑进位。
两种其实都可以,如果是第一种,那我们在运算过程中考虑进位就要多写一个if
,这在乘法中极为不友好;如果是第二种,那我们就需要多写一个for
,增加时间。
退位同理但只在减法中出现。
数字的比较
与我们自己比较数字的方法相同,从大的数位到小的数位一位一位的比较,但要注意符号。
写出一个大于和等于就可以实现所有的比较运算符。