高精度减法:判断A[] > B[]是否成立,成立sub(A,B);否则sub(B,A),并且在输出答案C[]时带上”-“
t表示借位,首先t = A[i]-t, t -= B[i],这时t最终会有两种结果:t<0 t>=0;如果t<0说明不够减要借位(+10),C[]中push_back(t + 10),如果t>=0则C[]直接push_back(t)即可;最终用C.push_back((t + 10)%10)同时考虑到了这两种情况
如果t<0就需要借位这时t=1;如果t!<0;不需要借位,这时借位为0
最后去除前导0
#include <iostream>
#include <vector>
using namespace std;
bool cmp(vector<int> &A,vector<int> &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];
return true;
}
//C = A - B
vector<int> sub(vector<int>& A,vector<int>& B){
vector<int> C;
for(int i = 0, t = 0;i < A.size();i ++){
t = A[i] - t;//本位减去借位
if(i < B.size()) t -= B[i];
C.push_back((t + 10) % 10);//如果本位最终在减去借位和B上对应位上的数后有两种情况: t>0 和 t<0;这段代码是将两种情况合二为一因为10%10=0;
if(t < 0) t = 1;
else t = 0;
}
//去除前导0
while(C.size() > 1 && C.back() == 0) C.pop_back();
return C;
}
int main(){
string a, b;
vector<int> A, B;
cin >> 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');
if(cmp(A,B)){
auto C = sub(A,B);
for(int i = C.size() - 1;i >= 0;i --) printf("%d",C[i]);
}
else{
auto C = sub(B,A);
printf("-");
for(int i = C.size() - 1;i >= 0;i --) printf("%d",C[i]);
}
return 0;
}