蓝桥杯备战(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;
}