1、为什么需要高精度算法?
请参考如下文章:
https://blog.csdn.net/papership/article/details/153468146
2、"高精度 减法"用于处理大整数(超过标准数据类型范围)的减法运算。
3、核心原理
高精度减法通过将大数字拆分为单个数字的数组,从最低位(右)向最高位(左)依次计算,同时处理 "借位" 问题,最终得到结果。是模拟手工减法的竖式计算过程。
4、算法实现过程
输入处理:将大数字符串转换为整数数组,低位在前
对齐处理:确保两个数位数相同,不足的补0
借位减法:从低位到高位逐位相减,处理借位
结果处理:去除前导零,处理负数情况
输出格式化:将结果数组转换回字符串
示例(以 "1234 - 567" 为例进行说明)

5、C++ 代码实现
#include
#include
#include
#include
using namespace std;
class BigIntSubtraction {
private:
// 比较两个大数的大小,用于确定结果符号
bool isGreater(const vector& a, const vector& 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; // 相等
}
public:
// 高精度减法:计算 a - b
string subtract(string num1, string num2) {
// 处理特殊情况
if (num1 == num2) return "0";
// 确定结果符号
bool negative = false;
if (!isGreaterString(num1, num2)) {
negative = true;
swap(num1, num2);
}
// 将字符串转换为数字数组(逆序存储,方便计算)
vector<int> a = stringToVector(num1);
vector<int> b = stringToVector(num2);
// 执行减法
vector<int> result = subtractVectors(a, b);
// 转换为字符串
string resStr = vectorToString(result);
// 添加负号(如果需要)
if (negative && resStr != "0") {
resStr = "-" + resStr;
}
return resStr;
}
private:
// 比较两个数字字符串的大小
bool isGreaterString(const string& a, const string& b) {
if (a.length() != b.length()) {
return a.length() > b.length();
}
for (int i = 0; i < a.length(); i++) {
if (a[i] != b[i]) {
return a[i] > b[i];
}
}
return true;
}
// 将字符串转换为数字向量(逆序)
vector<int> stringToVector(const string& s) {
vector<int> res;
for (int i = s.length() - 1; i >= 0; i--) {
res.push_back(s[i] - '0');
}
return res;
}
// 将数字向量转换为字符串
string vectorToString(const vector<int>& v) {
string res;
// 跳过前导零
int i = v.size() - 1;
while (i >= 0 && v[i] == 0) i--;
if (i < 0) return "0"; // 全部是零
for (; i >= 0; i--) {
res += to_string(v[i]);
}
return res;
}
// 核心减法算法:a - b(假设 a >= b)
vector<int> subtractVectors(const vector<int>& a, const vector<int>& b) {
vector<int> res;
int borrow = 0;
for (int i = 0; i < a.size(); i++) {
int digitA = a[i];
int digitB = (i < b.size()) ? b[i] : 0;
int diff = digitA - digitB - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
res.push_back(diff);
}
// 移除结果中的前导零
while (res.size() > 1 && res.back() == 0) {
res.pop_back();
}
return res;
}
};
// 测试函数
void testSubtraction() {
BigIntSubtraction calculator;
// 测试用例
vector<pair<string, string>> testCases = {
{"123", "45"},
{"1000", "1"},
{"1", "1000"},
{"999", "999"},
{"123456789", "987654321"},
{"1000000000", "1"},
{"0", "0"},
{"5", "10"}
};
for (auto& testCase : testCases) {
string a = testCase.first;
string b = testCase.second;
string result = calculator.subtract(a, b);
cout << a << " - " << b << " = " << result << endl;
}
}
int main() {
testSubtraction();
return 0;
}