题解:AcWing 792 高精度减法
【题目来源】
AcWing:792. 高精度减法 - AcWing题库
【题目描述】
给定两个正整数(不含前导 \(0\)),计算它们的差,计算结果可能为负数。
【输入】
共两行,每行包含一个整数。
【输出】
共一行,包含所求的差。
【输入样例】
32
11
【输出样例】
21
【解题思路】

【算法标签】
《AcWing 792 高精度减法》 #高精度#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
// 比较两个大数的大小,判断A是否大于等于B
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;
}
// 大数减法函数,计算A - B(要求A >= B)
vector<int> sub(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]; // 减去B的当前位
// 处理结果为负数的情况
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; // 输入的大数字符串
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;
}
【运行结果】
32
11
21
浙公网安备 33010602011771号