当前位置: 首页 > news >正文

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');
	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;
 } 

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

相关文章:

  • @maptalks/gl-layers中的VectorTileLayer的Symbol样式文档
  • 对该Django ORM查询的改进方案及详细说明
  • 表达式树和编译原理【10道经典面试题】(中英对照)
  • 机器人前沿技术的发展与展望
  • 《Manus学习手册》.pdf(文末附完整版下载地址)
  • 二叉树的前,中,后序遍历
  • 前端 -- 计算机图形学基础:光与三角形面(Mesh)求交
  • 系统转换、系统维护、净室软件工程、构件软件工程(高软51)
  • 【C++教程】bool类型
  • Android平台毫秒级低延迟HTTP-FLV直播播放器技术探究与实现
  • 【算法day19】括号生成——数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
  • MySQL中怎么分析性能?
  • ollama 设置环境变量OLLAMA_HOST允许外部访问
  • 深入探索ArkUI中的@LocalBuilder装饰器:构建高效可维护的UI组件
  • 【图像处理基石】ISP中的TNR算法详解:原理、实现与优化
  • 【经验总结】AUTOSAR架构下NvMBlock无效问题分析
  • 替代-UX设计师
  • 第四章·字符串列表元组字典集合
  • 数据结构与算法-数据结构-树状数组
  • NetSuite Saved Search隐藏功能 之 行间比较
  • 邮储银行一季度净赚超252亿降逾2%,营收微降
  • 深入贯彻中央八项规定精神学习教育中央指导组培训会议召开
  • 解读|特朗普“助攻”下加拿大自由党“惨胜”,卡尼仍需克服“特鲁多阴影”
  • 在循环往复的拍摄中,重新发现世界
  • 黄仁勋访华期间表示希望继续与中国合作,贸促会回应
  • 夜读丨庭院春韵