【入门级-算法-5、数值处理算法:高精度的减法】

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;

}

相关推荐
做怪小疯子13 分钟前
LeetCode 热题 100——哈希——最长连续序列
算法·leetcode·哈希算法
做怪小疯子37 分钟前
LeetCode 热题 100——双指针——三数之和
算法·leetcode·职场和发展
高山上有一只小老虎1 小时前
等差数列前n项的和
java·算法
sin_hielo1 小时前
leetcode 2536
数据结构·算法·leetcode
flashlight_hi1 小时前
LeetCode 分类刷题:203. 移除链表元素
算法·leetcode·链表
py有趣1 小时前
LeetCode算法学习之数组中的第K个最大元素
学习·算法·leetcode
吗~喽1 小时前
【LeetCode】将 x 减到 0 的最小操作数
算法·leetcode
what_20181 小时前
list集合使用
数据结构·算法·list
hetao17338372 小时前
2025-11-13~14 hetao1733837的刷题记录
c++·算法
hansang_IR2 小时前
【题解】洛谷 P2476 [SCOI2008] 着色方案 [记搜]
c++·算法·记忆化搜索