高精度运算

高精度运算

高精度运算是指在计算机编程中,对超出常规数据类型(如整型、浮点型)所能表示范围的极大或极精确数值进行的各种数学运算。在标准的计算机编程语言中,内置的整数和浮点数类型有其固定的字节数和精度限制,一旦数字过大或精度过高,就会导致溢出或精度丢失的问题

高精度运算通过创建一种自定义数据结构(如数组或动态链表)来存储极大数值的每一位,从而实现对大整数、大浮点数或任意精度数的加、减、乘、除以及其他高级运算。这种数据结构能够模拟人类手算时多位数列的运算规则,使得在理论上能够处理任意长度和精度的数字。

例如,在C++中,处理高精度数值(即任意长度的大整数)时,可以使用动态数组(std::vector<int>std::deque<char>来分别存储每一位数字,然后编写专门的函数来实现高精度数的加法、减法、乘法和除法等运算。

高精度加法

#include <iostream>
#include <vector>
// 定义高精度整数类
class BigInteger {
public:
    std::vector<int> digits;
    BigInteger(const std::string &str) {
        for (char c : str) {
            digits.push_back(c - '0');
        }
        reverse(digits.begin(), digits.end());
    }
    // 加法函数
    BigInteger operator+(const BigInteger &other) const {
        BigInteger result;
        result.digits.resize(std::max(digits.size(), other.digits.size()) + 1, 0);
        int carry = 0;
        for (size_t i = 0; i < digits.size() || i < other.digits.size() || carry; ++i) {
            int sum = carry;
            if (i < digits.size()) sum += digits[i];
            if (i < other.digits.size()) sum += other.digits[i];
            result.digits[i] = sum % 10;
            carry = sum / 10;
        }
        while (!result.digits.empty() && !result.digits.back()) {
            result.digits.pop_back();
        }
        return result;
    }
};
int main() {
    BigInteger a("123456789");
    BigInteger b("987654321");
    BigInteger sum = a + b;
    // 输出结果,这里需要添加反转输出逻辑
    return 0;
}

高精度减法

BigInteger BigInteger::operator-(const BigInteger &other) const {
    BigInteger result;
    size_t maxLen = std::max(digits.size(), other.digits.size());
    result.digits.resize(maxLen, 0);
    bool borrow = false;
    for (size_t i = 0; i < maxLen; ++i) {
        int difference = borrow ? digits[i] - 1 : digits[i];
        if (i < digits.size()) {
            difference -= (i < other.digits.size()) ? other.digits[i] : 0;
        }
        borrow = difference < 0;
        difference = (borrow ? difference + 10 : difference);
        result.digits[i] = difference;
    }
    // 清理前导零
    while (!result.digits.empty() && !result.digits.back()) {
        result.digits.pop_back();
    }
    return result;
}

高精度乘法

BigInteger BigInteger::operator*(const BigInteger &other) const {
    BigInteger result;
    result.digits.resize(digits.size() + other.digits.size(), 0);
    // 模拟竖式乘法,从低位到高位
    for (size_t i = 0; i < digits.size(); ++i) {
        for (size_t j = 0; j < other.digits.size(); ++j) {
            int product = digits[i] * other.digits[j];
            int index = i + j;
            result.digits[index] += product;
            // 进位处理
            while (result.digits[index] >= 10) {
                result.digits[index] %= 10;
                if (index + 1 < result.digits.size()) {
                    result.digits[index + 1]++;
                } else {
                    result.digits.push_back(1);
                }
            }
        }
    }
    // 清理前导零
    while (!result.digits.empty() && !result.digits.back()) {
        result.digits.pop_back();
    }
    return result;
}
// 示例:
BigInteger product = a * b;

高精度除法

// 由于高精度除法较为复杂,这里仅简述思路,实际实现可能需要更复杂的算法,如长除法或更高效的算法如Karatsuba算法等
BigInteger BigInteger::divide(const BigInteger &divisor) const {
    // 先检查除数是否为0,如果是则抛出异常或错误处理
    if (divisor == BigInteger(0)) throw std::invalid_argument("Divide by zero");
    BigInteger quotient, remainder(*this);
    quotient.digits.clear();
    while (remainder >= divisor) {
        int shift = remainder.digits.size() - divisor.digits.size();
        BigInteger trialDivisor(divisor);
        trialDivisor.digits.resize(shift + divisor.digits.size(), 0);
        BigInteger maxDivisible = remainder / trialDivisor;
        // 更新商和余数
        quotient.digits.insert(quotient.digits.begin(), maxDivisible.digits.begin(), maxDivisible.digits.end());
        remainder -= maxDivisible * divisor;
    }

    return quotient;
}
// 示例:
BigInteger quotient = a.divide(b);

除法部分的实现可能是最复杂的,通常涉及到更复杂的迭代或递归算法。同时,在实际工程中,为了提高效率,还可能需要实现快速模幂、快速乘等高效算法。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

筱姌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值