高精度减法
y总的代码可能给我带来一些理解上的困难,我这里将t
分成两个不同的字符t
和k
,t
表示进位,k
表示每一位的数值,对于我来说这样更好理解一些,这里分享给大家,当然大佬可以直接忽略,哈哈!!!!
#include <iostream>
#include <vector>
using namespace std;
// 判断是否有 A >= B
bool cmp(vector<int> &A, vector<int> &B) {
//位数个数不同,A的位数个数大就大,A的位数个数小就小
if (A.size() != B.size()){
return A.size() > B.size();
}
//位数相同,从高位开始比较,第一位不相等,判断A与B大小
for (int i = A.size() - 1; i >= 0; i--){
if(A[i] != B[i]){
return A[i] > B[i];
}
}
//所有位都相等则A与B相等,返回true
return true;
}
//C = A - B
vector<int> sub(vector<int> &A, vector<int> &B){
vector<int> C;
//从个位开始计算,A的size()一定大于B的size()
//t表示的是借位,其范围是0或1
for (int i = 0, t = 0; i < A.size(); i++){
//k表示每一位的数值
int k = A[i] - t;
if(i < B.size()){
k -= B[i];
}
/*if(k >= 0){
return k;
}else if(k < 0){
return k+10;
}*/
//将上面合为一步骤,即(k + 10) % 10
C.push_back((k + 10) % 10);
if(k < 0){
t = 1;
}else{
t = 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;
}