读入:双高精下统一用string录入,再倒序存入vector中;
note: 为了使vector中存入数字需要unicode转码:a[i] - ‘0’
输出:倒序输出;
高精度加法
循环条件:i < A.size() && i < B.size()
t = (A[i]) + (B[i]) + t
res = t % 10
刷新t /= 10
进位:循环后t!=0 则res里推1
高精度减法
特殊:
正负号再输出时加上;
手写cmp函数:1. 比较两个size 2.size相同从高位(逆序)比较数字; 最后默认返回true
循环条件:i < A.size()
t = A[i] - (B[i]) - t
res = (t + 10) % 10
刷新t: <0 ?? 1 : 0
去除先导0
高精度乘法:高精度*低精度
特殊:
b直接用int存;
循环条件i < A.size() || t(进位一步到位)
t = (A[i] * b) + t;
res = t % 10;
刷新t: t /= 10
去除先导0
高精*高精: https://www.acwing.com/solution/content/13694/
高精度除法: 高精度/低精度
特殊:
b直接用int存;
div函数里唯一需要逆向循环运算
需要输出余数r,定义在main函数中,div函数引用值
循环条件:逆向
r = r * 10 + A[i]
res = r / b;
刷新r = r % b
reverse
去先导0
压位
经验:加法压9位,乘法压4位(担心爆int)
将base变成9 or 4位数进制
前缀和
note: s[0] = 0; c++可直接将数组定义在全局变量里
重点:为了避免每次查询都重复算一遍sum和,所以预先把各个sum情况放在一个数组里;
一维:
预处理:s[i] = s[i - 1] + a[i]
输出s[l,r]: s[r] - s[l - 1];
二维:
预处理:s[i][j] = a[i][j] + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1]
输出x1y1, x2y2: s[x2][y2] - s[x2][y1-1] - s[x1 - 1][y2] + s[x1-1][y1-1]
差分
前缀和逆运算 a[n] = b[1] + b[2] + … b[n];
用来求一组操作(eg: 为某一段同时加上c)
初始化即执行insert(i, i, a[i]): 初始化时两数组全为0,天然差分关系;
输入并insert
输出b[i] 前缀和
二维:
初始化insert(i, j, i, j, a[i][j]);