我们在计算高精度减法的时候其实和高精度加法是有着异曲同工之处的,唯一需要改变的就是借位的逻辑还有数字大小的逻辑

下来我们来写一写高精度减法

刚开始呢我们还是和高精度加法一样高精度加法,我们需要先反转再计算

代码如下:

int main()
{
	string a,b;
	cin>>a>>b;
	//反转 
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	vector<int>A,B;
	//添加至数组 
	for(int i=0;i<a.size();i++)A.push_back(a[i]-'0');
	for(int i=0;i<b.size();i++)B.push_back(b[i]-'0');
	return 0;
 } 

在我们反转完成后我们就需要判断哪一个数字大了
具体原因已写在注释中
代码:

int main()
{
	string a,b;
	cin>>a>>b;
	//反转 
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	vector<int>A,B;
	//添加至数组 
	for(int i=0;i<a.size();i++)A.push_back(a[i]-'0');
	for(int i=0;i<b.size();i++)B.push_back(b[i]-'0');
	 
	//计算前准备工作,判断A和B谁大,我们这里假设A>=B
	vector<int>C;//结果 
	if(cmp(A,B))
	{
		//如果我们的A大于B相减一定是正数,我们直接计算
		C=sub(A,B);
	 } 
	 else{
	 	//如果是B大于A的话,那么我们相减的值一定是负值,所以我们在输出结果之前需要先输出一个' - ',同时交换相减的顺序,例如5-7=-2 我们在计算的时候也是先反过来 7-5=2 最后加上' - '完成计算
	 	cout<<'-';
		C=sub(B,A);  
	 }
	 reverse(C.begin(),C.end());
	 for(auto &e:C)cout<<e; 
	return 0;
 } 

cmp函数:

bool cmp(vector<int>&A,vector<int>&B)
{
	if(A.size()!=B.size())return A.size()>B.size();//如果长度不一样的话我们返回 (A的长度是不是大于B的长度,如果A的长度大于B的长度那么我们返回的是true,反之我们返回false) 
	for(int i=A.size()-1;i>=0;i--)//如果长度一样的话,我们就要寻找两个数第一个位置不相等的数的大小,看A大还是B大 例如 978 和987 当从最高位向下寻找的时候 发现9相同,下来比较 7和8 8大于7 所以B大于A
	{
		if(A[i]!=B[i]) return A[i]>B[i];
	}
	return true;//如果两个数相等的话,那么就返回true因为我们假设的是A>=B 
}

主要计算函数

vector<int>sub(vector<int>A,vector<int>B)
{
	vector<int>C;
	//进行减法计算
	int t=0;//t代表借位
	for(int i=0;i<A.size();i++)
	{
		t=A[i]-t;//开始计算,首先个位是不可能借出去位的所以t第一次一定等于0 
		if(i<B.size())t-=B[i];//判断B是否还有位数 
		C.push_back((t+10)%10);//这里算出来的是 此时A位-B位-借出去的数 ,这里+10后取模是为了结合两种情况,第一种情况A-B小于0,比如5-7=-2加10之后变为12 再用10取模得到2 同时下一步记录需要借位 第二种情况A-B大于0例如7-5=2 2+10=12取模等于 2 同时t>0 记录下一步不需要借位 
		if(t<0)t=1;
		else t=0;	
	} 
	//最后需要去处掉补位的0
	while(C.size()>1&&C.back()==0) C.pop_back();//判断C的长度大于1同时后面等于0 例如11000000000 我们返回后反转得到的结果就是 00000000011所以我们要去处这些补位的 0
	return C;
}

最终代码:

#include<bits/stdc++.h>
using namespace std;
bool cmp(vector<int>&A,vector<int>&B)
{
	if(A.size()!=B.size())return A.size()>B.size();//如果长度不一样的话我们返回 (A的长度是不是大于B的长度,如果A的长度大于B的长度那么我们返回的是true,反之我们返回false) 
	for(int i=A.size()-1;i>=0;i--)//如果长度一样的话,我们就要寻找两个数第一个位置不相等的数的大小,看A大还是B大 例如 978 和987 当从最高位向下寻找的时候 发现9相同,下来比较 7和8 8大于7 所以B大于A
	{
		if(A[i]!=B[i]) return A[i]>B[i];
	}
	return true;//如果两个数相等的话,那么就返回true因为我们假设的是A>=B 
}
vector<int>sub(vector<int>A,vector<int>B)
{
	vector<int>C;
	//进行减法计算
	int t=0;//t代表借位
	for(int i=0;i<A.size();i++)
	{
		t=A[i]-t;//开始计算,首先个位是不可能借出去位的所以t第一次一定等于0 
		if(i<B.size())t-=B[i];//判断B是否还有位数 
		C.push_back((t+10)%10);//这里算出来的是 此时A位-B位-借出去的数 ,这里+10后取模是为了结合两种情况,第一种情况A-B小于0,比如5-7=-2加10之后变为12 再用10取模得到2 同时下一步记录需要借位 第二种情况A-B大于0例如7-5=2 2+10=12取模等于 2 同时t>0 记录下一步不需要借位 
		if(t<0)t=1;
		else t=0;	
	} 
	//最后需要去处掉补位的0
	while(C.size()>1&&C.back()==0) C.pop_back();//判断C的长度大于1同时后面等于0 例如11000000000 我们返回后反转得到的结果就是 00000000011所以我们要去处这些补位的 0
	return C;
}
int main()
{
	string a,b;
	cin>>a>>b;
	//反转 
	reverse(a.begin(),a.end());
	reverse(b.begin(),b.end());
	vector<int>A,B;
	//添加至数组 
	for(int i=0;i<a.size();i++)A.push_back(a[i]-'0');
	for(int i=0;i<b.size();i++)B.push_back(b[i]-'0');
	 
	//计算前准备工作,判断A和B谁大,我们这里假设A>=B
	vector<int>C;//结果 
	if(cmp(A,B))
	{
		//如果我们的A大于B相减一定是正数,我们直接计算
		C=sub(A,B);
	 } 
	 else{
	 	//如果是B大于A的话,那么我们相减的值一定是负值,所以我们在输出结果之前需要先输出一个' - ',同时交换相减的顺序,例如5-7=-2 我们在计算的时候也是先反过来 7-5=2 最后加上' - '完成计算
	 	cout<<'-';
		C=sub(B,A);  
	 }
	 reverse(C.begin(),C.end());
	 for(auto &e:C)cout<<e; 
	return 0;
 } 

结果:
在这里插入图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐