原题链接 AcWing 792. 高精度减法
同高精度加法一样,c++也不支持高精度减法
高精度减法,同高精度加法一样,利用数组保存每位数字
这里我们给出112-99=13举例讲解sub函数部分
请同时结合代码体会下面的讲解,不然是看不懂的
1 第一步
最初 t=0 然后 t = a[0] - 0 = 2
然后 t -= b[0] 即t = 2 - 9 = -7
接下来取模,取模是为了将负数变为正数
(-7+10)%10 =3
所以sum[0] = 3
此时因为 t= -7 < 0 所以说明 本次运算向上借位了,所以要将t赋值为1
2 第二步
因为上一步借位了,所以t开始等于1;
t=a[1]-t= 1-1 =0
然后 t -= b[1] = -9
(-9+10)%10 = 1
sum[1] = 1
因为t= -9<0 说明向百位借位了
所以 t 赋值为 1
3 第三步
t = a[2]-t = 1 -1 =0
因为此时b数组已经没有数字了,所以不在参与运算
(0+10)%10 = 0
所以sim[2] = 0
退出循环
然后去掉前导零
//高精度减法模板函数
void sub(v &a, v &b){
int t=0;//记录进位情况;
for(int i=0;i<a.size();i++){
t=a[i]-t;
if(i<b.size())t-=b[i];//防止越界
sum.push_back((t+10)%10);//若t小于零,则加十取模为正的,因为借位了
if(t<0)t=1;//t小于0说明不够减的,说明借位了,算下一位是要把借的位减去
else t=0;
}
//要去掉它的前导零
//若是答案就是0 就不用去掉了
while(sum.size()>1&&sum.back()==0)sum.pop_back();
}
这是完整代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
typedef vector<int > v;
string s1,s2;//读入的数字字符串
vector<int >sum; //保存最后答案
bool cmp(v &a,v &b){
// 若是长度不同,长的是大的
if(a.size()!=b.size())return a.size()>b.size();
for(int i=a.size()-1;i>=0;i--){
//返回大位数
if(a[i]!=b[i]) return a[i]>b[i];
}
//若是两数字相等,返回true
return true;
}
// sum = a - b;
void sub(v &a, v &b){
int t=0;//记录进位情况;
for(int i=0;i<a.size();i++){
t=a[i]-t;
if(i<b.size())t-=b[i];//防止越界
sum.push_back((t+10)%10);//若t小于零,则加十取模为正的,因为借位了
if(t<0)t=1;//t小于0说明不够减的,说明借位了,算下一位是要把借的位减去
else t=0;
}
//要去掉它的前导零
//若是答案就是0 就不用去掉了
while(sum.size()>1&&sum.back()==0)sum.pop_back();
}
int main(){
cin>>s1>>s2;
vector<int >a,b;//被减数和减数
for(int i=s1.size()-1;i>=0;i--)a.push_back(s1[i]-'0');
for(int i=s2.size()-1;i>=0;i--)b.push_back(s2[i]-'0');
//如果a>b
if(cmp(a,b)){
sub(a,b);
for(int i=sum.size()-1;i>=0;i--)cout<<sum[i];
}
//b>a
else{
sub(b,a);
cout<<'-';
for(int i=sum.size()-1;i>=0;i--)cout<<sum[i];
}
return 0;
}