1.3高精度运算

该博客详细介绍了如何实现高精度数字的加、减、乘、除运算。通过将输入的字符串转化为整数数组,然后进行倒序处理,模拟传统竖式运算过程。加法和减法中考虑了数字大小及可能产生的负数情况,乘法涉及将一个大整数与一个小整数相乘,除法则实现了大整数除以小整数并返回商和余数。代码使用C++编写,并提供了洛谷平台的相关题目链接作为示例。
摘要由CSDN通过智能技术生成

3.1高精度加法

思路
  1. 输入的是字符串,但是相加的时候必须要转换为数字,所以将字符型减去‘0’(0的字符)即可得到int型的数字。
  2. 将字符串倒叙存储
  3. 从个位开始模拟竖式加法的过程,完成整个加法。
  4. 倒叙输出结果
代码
#include<bits/stdc++.h>
using namespace std;

string a,b;
vector<int> A,B;
vector<int> add(vector<int> &A,vector<int> &B)
{
	if(A.size()<B.size()) return add(B,A);
	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;	
}
int main(){
	cin>>a>>b;
	for(int i=a.size()-1;i>=0;--i) A.push_back(a[i]-'0');
	for(int i=b.size()-1;i>=0;--i) B.push_back(b[i]-'0');
	vector<int> C=add(A,B);
	for(int i=C.size()-1;i>=0;--i) printf("%d",C[i]);
	return 0;
}
题目

洛谷:P601 A+B高精 https://www.luogu.com.cn/problem/P1601

3.2高精度减法

思路
  1. 输入的是字符串,但是相加的时候必须要转换为数字,所以将字符型减去‘0’(0的字符)即可得到int型的数字。
  2. 将字符串倒叙存储
  3. 比较a和b的大小。进行check是否输出负号
  4. 从个位开始模拟竖式减法的过程,完成整个减法。
  5. 倒叙输出结果
代码
#include<bits/stdc++.h>
using namespace std;

string a, b;
vector<int> A, B;
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]-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();
	return C;
}

bool check(vector<int> &A, vector<int> &B) {
	if (A.size() > B.size()) return true;
	else if (A.size() < B.size()) return false;
	else for (int i = A.size() - 1; i >= 0; i--) {
			if(A[i]!=B[i]) return A[i]>B[i];
		}
	return true;
}


int main() {
	cin >> a >> b;
	for (int i = a.size() - 1; i >= 0; --i) A.push_back(a[i] - '0');
	for (int i = b.size() - 1; i >= 0; --i) B.push_back(b[i] - '0');

	if (check(A, B)) {
		vector<int> C = sub(A, B);
		for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);
	} else {
		vector<int> C = sub(B, A);
		printf("-");
		for (int i = C.size() - 1; i >= 0; --i) printf("%d", C[i]);
	}
	return 0;
}
题目

洛谷P2142高精度减法:https://www.luogu.com.cn/problem/P2142

3.3高精度乘法

思路

大整数乘上小整数

代码
#include<bits/stdc++.h>
using namespace std;

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;
	}
	
	return C;
	
}


int main(){
	string a;
	int b;
	vector<int> A;
	cin>>a>>b;
	for(int i=a.size()-1;i>=0;i--) A.push_back(a[i]-'0');
	
	auto C=mul(A,b);
	for(int i=C.size()-1;i>=0;i--) printf("%d",C[i]);

	return 0;
}

3.4高精度除法

思路

大整数除小整数

代码
#include<bits/stdc++.h>
using namespace std;

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*r+A[i];
		C.push_back(r/b);
		r=r%b;
	}
	while(C.size()>1&& C.back()==0) C.pop_back();
	return C;
}


int main() {
	string a;
	int b;
	vector<int> A;
	cin >> a >> b;
	for (int i = a.size() - 1; i >= 0; i--) A.push_back(a[i] - '0');
	int r;//余数
	auto C = div(A, b, r);
	for (int i = C.size() - 1; i >= 0; i--) printf("%d", C[i]);
	cout << endl << r << endl;

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值