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

蓝桥杯备战(AcWing算法基础课)-高精度-减-高精度

目录

前言

1 题目描述

2 分析

2.1 第一步

2.2 第二步

3 代码


前言

详细的代码里面有自己的理解注释

1 题目描述

给定两个正整数(不含前导 00),计算它们的差,计算结果可能为负数。

输入格式

共两行,每行包含一个整数。

输出格式

共一行,包含所求的差。

数据范围

1≤整数长度≤1e5 

输入样例:

32
13

输出样例:

19

2 分析

由前面对高精度-加-高精度的分析,我们输入先采用string存储,然后换成int数字,并且按照数组下标的低位存储数值低位存储数值。

2.1 第一步

利用for循环遍历两个string字符串,将其转换为对应的数字,即a[i]-'0',b[i]-'0',进行减法运算,我们确保A-B一定是A>=B,这样方便计算,如果B<A,我们只需要先输出-然后再计算B-A即可。

2.2 第二步

在for循环做减法时,当i<B.size()时,每位值为A[i]-B[i],否则为A[i]。我们用t保存每位值相减后的借位,第一次t=0,后面的每次当i++时,如果A[i]-B[i]<0,那么t=1,因为A[i]不够减需要向i+1借位。例如32-13,第一位t=A[i]-B[i]-t=2-3-0=-1,那么在个位需要保留的就是1,A的十位上,需要借位1,t=1,然后t=A[i]-B[i]-t=3-1-1=1,那么在十位需要保留的就是1,百位上,借位为0,也就是t=0,i++之后for循环结束,因为在做减法时,我们保证了A>B,那么A和B的最高位相减不会有借位,我们需要在for循环结束之后不用补上,但是在减法里面,我们需要注意前导0,比如16-16,按照计算之后,我们可以知道C里面存储的是00,我们只需要保存一个0即可

3 代码

#include<iostream>
#include<vector>

using namespace std;
typedef long long LL;
const int N = 1e5 + 10;

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

//C = A - B , A >= 0 B >= 0
vector<int> sub(vector<int> &A,vector<int> &B) {
	//保证A > B 
	 if(!cmp(A,B)) {
		cout<<"-";
		return sub(B,A);
	}
	
	vector<int> C;
	
	int t = 0;
	for(int i = 0; i < A.size(); i ++ ) {
		t = A[i] - t;
		if(i < B.size()){
			t = t - B[i];
		}
		if(t < 0){
	        C.push_back((t + 10) % 10);
	        t = 1;
	    }else{
	        C.push_back(t % 10);
	        t = 0;
	    }
	}
	
	//***记得去前导 0  
	while(C.size()>1&&C.back() == 0) {
		C.pop_back();
	}
	
	return C;
}
/*
834759941806152327900303151940196336060166992323381793006569112355455417182275047723716863558023198812556660965034876453196343663912966691993179332101329457072368130838432382442268056736351699000531533905891383548143212225860594411852986342939876618040011587608495448302207348447231253749252393529480791364963334998240618542705610316034216640260057315992222960153236561529337492196200456790971074681689375240113760172920200875086339547064832250693720175733336019433955946578365398845698054072342
1730212895609293780968781134422638013529337293953691202590416001015768176027398863777824489704339557737408048293638085241389042173942253145158882643543317299641617721453243716470035888718649999433851361288450883586077443742282144148770165505395776302856007672738840600408025145144269621804651639658798526865013172504028693729820255215825318827715895274406426858072321951569289515588456319694750151164168327105512059938690032122373175061408639335004407082357709386204929019847
*/
int main() {
	string a,b;
	cin>>a>>b;//a = "123456"
	vector<int> 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 = sub(A,B);

	for(int i = C.size() - 1 ; i >= 0 ; i --) {
		cout<<C[i];
	}
	return 0;
}

http://www.kler.cn/a/227730.html

相关文章:

  • UE5制作视差图
  • TDengine 做 Google Looker Studio 数据源
  • 论文阅读:Realistic Noise Synthesis with Diffusion Models
  • origin如何在已经画好的图上修改数据且不改变原图像的画风和格式
  • maven、npm、pip、yum官方镜像修改文档
  • MySQL中的读锁与写锁:概念与作用深度剖析
  • 01-Java工厂模式 ( Factory Pattern )
  • node + express 学生信息管理
  • MongoDB复制集实战及原理分析
  • JAVA后端上传图片至企微临时素材
  • C语言如何认识 printf()函数的格式字符?
  • 车载测试Vector工具CANape——常见问题汇总(上)
  • hdf5文件node name长度可以支持多长?
  • Tailwind CSS
  • 第十二篇【传奇开心果系列】Python的OpenCV技术点案例示例:视频流处理
  • 代码随想录训练营第三十四天|860.柠檬水找零406.根据身高重建队列
  • 蓝桥杯刷题day05——2023
  • Leetcode刷题笔记题解(C++):99. 恢复二叉搜索树
  • 【QT+QGIS跨平台编译】之二十:【xerces+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 寒假 day1
  • 实时聊天系统
  • 网络原理TCP/IP(4)
  • 老版本labelme如何不保存imagedata
  • 【TCP】四次挥手(终止连接)
  • Logback学习
  • 新手从零开始学习数学建模论文写作(美赛论文临时抱佛脚篇)