【入门级-算法-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;

}

相关推荐
lingran__4 小时前
算法沉淀第十天(牛客2025秋季算法编程训练联赛2-基础组 和 奇怪的电梯)
c++·算法
DuHz4 小时前
基于MIMO FMCW雷达的二维角度分析多径抑制技术——论文阅读
论文阅读·物联网·算法·信息与通信·毫米波雷达
Dragon_D.5 小时前
排序算法大全——插入排序
算法·排序算法·c·学习方法
好好研究5 小时前
JAVAEE知识整理之AJAX、JSON
ajax·java-ee·json·1024程序员节
大数据张老师5 小时前
数据结构——红黑树
数据结构·算法·红黑树
隔壁程序员老王5 小时前
基于 Python 的坦克大战小程序,使用 Pygame 库开发
python·小程序·pygame·1024程序员节
自在极意功。6 小时前
动态规划核心原理与高级实战:从入门到精通(Java全解)
java·算法·动态规划·最优子结构·重叠子问题
F_D_Z6 小时前
SkyDiffusion:用 BEV 视角打开街景→航拍图像合成新范式
diffusion·sota·1024程序员节·bev·skydiffusion·视角变换·多图融合
文火冰糖的硅基工坊6 小时前
[人工智能-大模型-54]:模型层技术 - 数据结构+算法 = 程序
数据结构·人工智能·算法