AcWing 792. 高精度减法
原题链接
简单
作者:
L-China
,
2022-11-21 11:23:22
,
所有人可见
,
阅读 413
C++
#include<iostream>
#include<vector>
using namespace std;
// 判断是否 A >= B
bool cmp (vector<int> &A, vector<int> &B){
//首先判断一下位数,A的位数大,A就大,A的位数小,A就小
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; // 如果 A == B, 返回true
}
// C = A - B 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];//如果此时B还有,- B[i]
C.push_back((t + 10) % 10); // 两种情况合二为一来写(t >= 0, t; t < 0, t + 10)
if (t < 0) t = 1; // 借的位
else t = 0;
}
//判断一下含有前导0的情况(例:123 - 120 = 003)
while (C.size() > 1 && C.back() == 0) C.pop_back(); // C.size() > 1 防止 (120 - 120 = 0)
return C;
}
int main(){
string a, b;
vector<int> A, B;
cin >> a >> b; // a = "123456"
for (int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');//A = [6, 5, 4, 3, 2, 1]
for (int j = b.size() - 1; j >= 0; j --) B.push_back(b[j] - '0');
vector<int> C;
if (cmp (A, B)){ // 如果 A >= B
C = sub(A, B);
for (int i = C.size() - 1; i >= 0; i --) printf("%d", C[i]);
}else{ // 否则
C = sub(B, A);
cout << '-'; // 输出的时候先输出一个负号
for (int i = C.size() - 1; i >= 0; i --) printf("%d", C[i]);
}
return 0;
}
orz