在上期文章中,我分享了高精度加法
(详见 高精度算法之高精度加法_zhanghanyuqqqq的博客-CSDN博客)
A-B problem时,总会要求用高精度减法,如:
假设有两个非常大的整数A和B,现在需要计算它们的差,但由于它们太大,无法用普通的减法计算,这时就需要用到高精度减法。以下是一个具体的应用题:
问题描述:有两个大整数A和B,请计算A-B的结果。
解决方法:
-
将A和B表示为字符串形式,并将它们转换为整数数组(每个元素表示一位数字)。
-
对于A和B的每一位进行相减运算,需要考虑借位的情况。
-
从A的最高位(即最左侧的数字)开始减去B的对应位,如果A的该位小于B的该位,则需要向高位借位,具体做法是将A的前一位减去1,并将该位加上10。如果A的该位大于等于B的该位,则直接进行减法运算。
-
继续从高位向低位进行减法运算,直到A和B的所有位都被处理完毕。
-
将运算结果转换为字符串形式,并去掉前导零。
-
如果A小于B,则需要在结果前面加上负号。
举个例子,假设A=123456789012345678901,B=4567890123456789,则其高精度减法的结果为: 123451220121911911012
先写程序
#include<bits/stdc++.h>
using namespace std;
string a,b;
int x[150],y[150],sub[300];
bool sign;
int main(){
cin>>a>>b;
int la=a.size();
int lb=b.size();
if(la<lb){
sign=1;
}
else if(la==lb && a<b){
sign=1;
}
if(sign==1){
swap(a,b);
}
la=a.size();
lb=b.size();
for(int i=0;i<la;i++){
x[i]=a[la-i-1]-'0';
}
for(int i=0;i<lb;i++){
y[i]=b[lb-i-1]-'0';
}
for(int i=0;i<la;i++){
sub[i]=x[i]-y[i];
}
for(int i=0;i<la;i++){
if(sub[i]<0){
sub[i]+=10;
sub[i+1]--;
}
}
int l=la-1;
while(sub[l]==0 && l>0){
l--;
}
if(sign==1){
cout<<"-";
}
for(int i=l;i>=0;i--){
cout<<sub[i];
}
return 0;
}