高精度 A-B
2023-07-25 20:25:57
发布于:河北
模拟列式减法。
计算的最终答案是存放在 c 字符串中,两数相减的数位最大是长度最长的数位不需要多 1 位。
最后需要将数字转换为char类型字符数字,以及删除前置 0。
#include <bits/stdc++.h>
using namespace std;
// 判断较大的数字是否是 b
bool check(const string &a, const string &b) {
// a 数位长度小于 b,整数 a 小于 b
if (a.length() < b.length()) return true;
else if (a.length() > b.length()) return false;
// 否则比较字典序即可
return a < b;
}
string subtraction(string a, string b) {
//构造一个答案 c 字符串,长度是 a 与 b 最长的,全部初始化为 ASCII 0,方便做减法运算
string c(max(a.length(), b.length()), 0);
// 先将较大的数字放在 a 字符串中,标记 sign 作为判断负数的依据
bool sign = false;
if (check(a, b)) {
sign = true;
a.swap(b);
}
// i 表示 a 整数的数位,j 表示 b 整数的数位,均从个位开始相减
for (int i = a.length() - 1, j = b.length() - 1; i >= 0; i--, j--) {
c[i] += (a[i] - '0') - (j >= 0 ? b[j] - '0' : 0);
if (c[i] < 0) { // 需要借位
c[i - 1] = -1;
c[i] += 10;
}
}
// 将所有的整数转换为字符数字
for (int i = 0; i < c.length(); i++) {
c[i] += '0';
}
// 删除前置 0
while (c.length() > 1 && c.front() == '0') c.erase(c.begin());
if (sign) return "-" + c;
return c;
}
int main() {
string a, b;
cin >> a >> b;
cout << subtraction(a, b);
return 0;
}
这里空空如也
有帮助,赞一个