【模板】算法基础之高精度加减乘除、前缀和与差分

高精度加法

 

// C = A + B, A >= 0, B >= 0
vector<int>add(vector<int>&A, vector<int>&B)//
{
	if (A.size() < B.size())return add(B, A);//保证A.size>B.size可以少一个判断条件
	vector<int>C;
	int t = 0;
	for (int i = 0; i < A.size(); i++)
	{
		t += A[i];
		if (i < B.size())t += B[i];
		C.push_back(t % 10);
		t /= 10;//进位
	}
	if (t)C.push_back(t);//如果有最后一个进位
	return C;
}

练习

P1601 A+B Problem(高精)

高精度减法

//C=A-B,满足A>=B,A>=0,B>=0
vector<int>sub(vector<int>&A, vector<int>&B)
{
	vector<int>C;
	for (int i = 0, t = 0; i < A.size(); i++)
	{
		t = A[i] - t;
		if (i < B.size())t -= B[i];
		C.push_back((t + 10) % 10);//t<0借位否则为t
		if (t < 0)t = 1;//同时用t存借位
		else t = 0;
	}
	while (C.size()>1 & C.back() == 0)C.pop_back();//排除前导零
	return C;
}

注:常需搭配cmp()函数,确保A>=B

练习

P2142 高精度减法

高精度乘法(大数乘小数 A*b)模板

//C=A*B,满足A>=0,B>=0
vector<int>mul(vector<int>&A, int b)
{
	vector<int>C;
	int t = 0;
	for (int i = 0; i < A.size() || t; i++)
	{
		if (i < A.size())t += A[i] * b;
		C.push_back(t % 10);
		t /= 10;
	}
	while (C.size()>1 && C.back() == 0)C.pop_back();//排除前导零
	return C;
}

练习

P1303 A*B Problem

高精度除法(大数除小数 A/b)

//A/b=c...r,A>=0,b>0
vector<int>div(vector<int>&A, int b, int &r)
{
	vector<int>C;
	r = 0;
	for (int i = A.size() - 1; i >= 0; i--)
	{
		r = r * 10 + A[i];
		C.push_back(r / b);
		r %= b;
	}
	reverse(C.begin(), C.end());//如果是逆序输出需要reverse()
	while (C.size() > 1 & C.back() == 0)C.pop_back();//排除前导零
	return C;
}

练习

P5432 A/B Problem(高精度除法)

一维前缀和(公式)

s[i] = a[1] + a[2] + ... + a[i]//前n项和
s[i] = s[i - 1] + a[i]//预处理前缀和数组
a[i] + ... + a[r] = S[r] - S[l - 1]//[l,r]区间之和

练习

#58. 前缀和

二维前缀和(公式)

s[i,j]=第i行j列格子左上部分所有元素的和
s[i, j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i]//预处理前缀和矩阵
以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1-1,y1-1]//容斥原理

练习

2056 - 子矩阵的和

一维差分(公式)

给区间[l, r]中的每个数加上c:B[l] += c, B[r+1]-=c//B[n]是S[n]的差分数组

练习

P2367 语文成绩

二维差分(公式)

给以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵中的所有元素加上c:
B[x1, y1] += c, B[x2 + 1, y1] -= c, B[x1, y2 + 1] -= c, B[x2 + 1, y2 + 1] += c

练习

2339: 差分矩阵

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值