【基础算法】高精度

本文详细介绍了大整数在计算机中的存储方式(小端模式),以及如何进行高精度的加法、减法、乘法和除法运算,包括使用vector实现的算法和相关编程题目示例,如AcWing和洛谷平台的问题791-794。
摘要由CSDN通过智能技术生成

一、大整数的存储

        大整数的存储使用数组,利用小端的思想,方便进位。

        小端(little-endian):一种在内存中存放多字节数据时的字节存放次序,其中最低位所在字节存放在较低的起始地址,最高位所在字节存放在较高的结束地址

        比如,对于整数123456789:

数组012345678
存储内容987654321

二、高精度加法

        两个非负整数相加,每一位:C_{i} = A_{i} + B_{i} + t_{i-1}( 其中t_{i-1}为前一位的进位 )

vector<int> Add(vector<int> &A, vector<int> &B){
	vector<int> C;
	int t = 0;
	for(int i=0; i<A.size() || i<B.size(); i++){
		if(i < A.size()) 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;
}

相关题目:

AcWing 791. 高精度加法 :791. 高精度加法 - AcWing题库

洛谷 P1601 A+B Problem(高精): P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

三、高精度减法

        两个非负整数相减,为了保证是较大的数减去较小的数,即计算结果为非负整数:

        A-B=\left\{\begin{matrix} A-B, \quad A\ge B \\ -(B-A), \quad A < B \end{matrix}\right.

/*比较函数Cmp(compare),如果A>=B返回true,否则返回false*/
bool Cmp(vector<int> &A, vector<int> &B){
	if(A.size() != B.size()) return A.size()>B.size(); //如果两个数位数不同
	//如果两个数位数相同 
	for(int i=A.size()-1; i>=0; i--){
		if(A[i] != B[i]) return A[i]>B[i]; 
	}
	return true; //两个数相同 
}

        设当前位计算结果为C_i,则C_i = A_i - B_i - t(其中,t为前一位的借位)

        此时C_i=\left\{\begin{matrix} C_i, \quad C_i\ge 0 \\ C_i+10, \quad C_i < 0 \end{matrix}\right.

vector<int> Sub(vector<int> &A, vector<int> &B){
	vector<int> C;
	int t = 0;
	for(int i=0; i<A.size(); i++){
		//t = A[i]-B[i]-t 
		t = A[i] - t;  
		if(i < B.size()) t -= B[i];
		C.push_back((t+10)%10);
		if(t < 0) t = 1; //需要借位
		else t = 0; //不需要借位
	}
	while(C.size()>1 && C.back()==0) C.pop_back(); //使得001变成1 
	return C;
}

相关题目:

AcWing 792. 高精度减法 :792. 高精度减法 - AcWing题库

四、高精度乘低精度

vector<int> Mul(vector<int> &A, int b){
	vector<int> C;
	int t = 0;
	for(int i=0; i<A.size() || t!=0; i++){
		if(i < A.size()) t += A[i]*b;
		C.push_back(t%10);
		t = t/10;
	}
	while(C.size()>1 && C.back()==0) C.pop_back(); //去掉前导0,如0*123=000,应变为0 
	return C;
}

相关题目:

AcWing 793. 高精度乘法 :793. 高精度乘法 - AcWing题库

五、高精度除以低精度

vector<int> Div(vector<int> &A, int b, int &r){ //A/b, 商为C, 余数为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 = r%b;
	}
	reverse(C.begin(), C.end());
	while(C.size()>1 && C.back()==0) C.pop_back(); //去掉前置0 
	return C;
}

相关题目:

AcWing 794. 高精度除法 :794. 高精度除法 - AcWing题库

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值