题目:
Solution:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> subtract(vector<int> &A, vector<int> &B) {
vector<int> C;
int t = 0;
for (int i = 0; i < A.size(); i++) {
t = A[i] - t;
if (i < B.size())
t -= B[i];
C.push_back((t + 10) % 10);
if (t < 0)
t = 1;
else
t = 0;
}
while (C.size() > 1 && C.back() == 0)
C.pop_back();
return C;
}
int main() {
string a, b;
cin >> a >> b;
vector<int> 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 (a.size() < b.size() || (a.size() == b.size() && a < b)) {
swap(A, B);
cout << "-";
}
auto C = subtract(A, B);
for (int i = C.size() - 1; i >= 0; i--)
cout << C[i];
return 0;
}
高精度减法与高精度加法类似,只不过在减法的过程中需要考虑被减数与减数的大小关系,以确定结果是否为负数。
我们先比较两个数的大小,如果被减数比减数小,就将它们交换,并输出一个负号。然后按照普通的减法运算方法,从低位到高位逐位相减,注意在每一位的计算过程中需要加上上一位的借位。最后要去掉结果中的前导0。
其中,在subtract
函数中,t
表示上一位的借位,初始值为0,每次减法计算时,先减去上一位的借位t
,再减去当前位的值。若结果t
小于0,则说明需要向高位借位,此时将t
设为1;否则将t
设为0。最后将当前位的结果加入到结果数组C
中。
最后,还需要注意,当结果中存在前导0时,需要将其去掉。