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

1、为什么需要高精度算法?
请参考如下文章:
https://blog.youkuaiyun.com/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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papership

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值