高精度算法解析和高精度赛场用模板
1.高精度算法介绍
高精度算法,又称数值处理算法。意在通过数组模拟较大整数的存储和使用。本篇文章就会给大家介绍赛场上使用的精简版高精度算法模版。
2.高精度结构体前置函数
2.1.定义高精度结构体
首先定义一个高精度结构体。用数组a储存这个数,用变量len
储存这个数的长度。MAXN代表数组a的最大长度。
#define MAXN 1010
struct bigint {
int len, a[MAXN];
};
2.2.重载[ ]
为了方便访问数组a中的元素,我们需要重载[ ]。
int& operator[](int i) {
//用x[i]代替x.a[i]
return a[i];
}
2.2.构造函数
我们有时会需要用低精度整数来初始化高精度整数。这个时候就需要构造函数了。注意:为了方便实用,数组a倒序存储这个数字,即a[1]代表这个数的最后一位,以此类推。
bigint(int x = 0){
//默认这个数是0
memset(a, 0, sizeof(a));//初始化数组a
if (x == 0){
//如果x是0会直接跳过底下的循环,导致len被初始化为0,所以要特判
len = 1;
return;//直接返回
}
for (len = 1; x; len++)//只要x没被取完就一直去并增加这个数的长度
a[len] = x % 10, x /= 10;//倒序存储x
len--;//最后len总会多1
}
2.3.输入输出
我们用一个字符串模拟输入。然后倒序存储。输出就直接倒序输出。
void in_data() {
//输入高精度整数
string s; cin >> s;//暂时存储到字符串里面
memset(a, 0, sizeof(a)); len = 0;//清空数组并初始化这个大整数
for (int i = s.length() - 1; i >= 0; i--, len++)//字符串转整数
a[s.lengt