欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

高精度减法-AI生成

时间:2024-05-11 13:13 作者:admin 点击:
高精度减法是处理大数运算的另一个基本操作。与高精度加法类似,我们可以使用字符串来表示大数,并进行逐位的减法运算。 以下是一个高精度减法的函数实现: #include iostream#incl

高精度减法是处理大数运算的另一个基本操作。与高精度加法类似,我们可以使用字符串来表示大数,并进行逐位的减法运算。

以下是一个高精度减法的函数实现:

#include <iostream>
#include <string>
#include <algorithm>

// 高精度减法函数
std::string bigIntegerSubtract(const std::string& num1, const std::string& num2) {
    // 确保num1比num2大,如果不是,则交换它们
    if (num1 < num2) {
        std::swap(num1, num2);
    }

    // 反转字符串以进行减法运算
    std::string num1_reversed = num1;
    std::string num2_reversed = num2;
    std::reverse(num1_reversed.begin(), num1_reversed.end());
    std::reverse(num2_reversed.begin(), num2_reversed.end());

    std::string result;
    int borrow = 0;
    int index1 = 0;
    int index2 = 0;

    // 逐位相减,直到num2遍历完
    while (index2 < num2_reversed.size()) {
        int digit1 = index1 < num1_reversed.size() ? num1_reversed[index1++] - '0' : 0;
        int digit2 = num2_reversed[index2++] - '0';
        if (digit1 < digit2 + borrow) {
            // 如果当前位不够减,从高位借位
            digit1 += 10;
            borrow = 1;
        } else {
            borrow = 0;
        }
        result.push_back((digit1 - digit2 - borrow) + '0');
    }

    // 将剩余的num1的位数添加到结果中
    while (index1 < num1_reversed.size()) {
        result.push_back(num1_reversed[index1++] + '0');
    }

    // 移除结果前面的所有0
    size_t pos = result.find_first_not_of('0');
    if (pos != std::string::npos) {
        result.erase(0, pos);
    } else {
        // 如果结果都是0,确保至少有一个'0'
        result = "0";
    }

    // 反转结果字符串以获得最终结果
    std::reverse(result.begin(), result.end());

    return result;
}

int main() {
    std::string num1 = "9876543210987654321";
    std::string num2 = "12345678901234567890";

    std::string difference = bigIntegerSubtract(num1, num2);
    std::cout << "Difference: " << difference << std::endl;

    return 0;
}

这个函数bigIntegerSubtract接受两个字符串类型的大整数作为参数,首先确保num1大于或等于num2,然后反转这两个字符串进行逐位的减法运算。

在减法过程中,如果当前位不够减,则从高位借位(借位即加10)。最后,将剩余的num1的位数添加到结果中,并移除结果前面的所有零。

请注意,这个函数假设输入的字符串是合法的非负整数,并且num1至少和num2一样大。如果需要处理负整数或验证输入的有效性,你需要添加额外的逻辑。

此外,这个函数没有进行任何优化,对于非常大的数,效率可能不是最优的。


(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%