高精度计算(Arbitrary-Precision Arithmetic),也被称作大整数(bignum)计算,运用了一些算法结构来支持更大整数间的运算(数字大小超过语言内建整型)。
Ⅰ.高精度储存
利用字符串读入数字,然后按位将字符转化为每位整形数字
//c++
string s;
cin >> s;
int a[maxLength] = { 0 }; //记得初始化0
for (int i = 0; i < s.length(); ++i) {
a[s.length() - 1 - i] = s[i] - '0'; // 倒序存储
}
Ⅱ.高精度加法
初始化一个变量tool
用来存放每次相加带来的进位
将两位高精度储存数组按位相加,并与上一位的进位相加 (进位变量初始化为 0,保证个位相加时来自上一位的进位为 0)
对当前位的数与10进行整型除法 当前位若小于10,赋值给进位变量为0
;若大于等于10,赋值给进位变量为1
对当前位模10,不足10不变,满10归零
上述操作在for循环中循环至数组最高位,高精度加法完成。
//c++
void gjdJ(int a[], int b[]) { //高精度加法函数
int tool = 0;
for (int i = 0; i < MAX; i++) {
a[i] = a[i] + b[i] + tool; //对现位加法运算,并与前一位的进位tool变量相加
tool = a[i] / 10; //判断现位加法运算后是否大于10,如果是,其除以10后值为1,赋值给tool变量
a[i] %= 10; //对现位加法运算后取余数,不足10不变,满10归零,赋值给a[i],即现位的值
}
}
Ⅲ.高精度乘法
①.高精度*高精度
//c++
void gjdC(int a[], int b[], int c[], int A, int B) {
for (int i = 0; i < A; i++) {
for (int j = 0; j < B; j++) {
c[i + j] += a[i] * b[j];
}
}
// 处理进位
for (int i = 0; i < A + B; i++) {
if (c[i] >= 10) {
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
}
}
②.高精度*低精度
//c++
#define MaxNum 1145 //高精度数组最大位数
void gjdC(int a[], int b) {
for (int i = MaxNum-1; i >= 0; i--) {
a[i] *= b;
}
// 处理进位
for (int i = MaxNum-1; i > 0; i--) {
if (a[i] >= 10) {
a[i - 1] += a[i] / 10;
a[i] %= 10;
}
}
if (a[0] >= 10) { //防止位数溢出时越界访问
a[0] %= 10;
}
}