高精度运算

简介: 高精度运算

高精度运算

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

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

例如,在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);

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

目录
相关文章
|
2月前
|
存储 人工智能 决策智能
每日一题——博弈论(枚举与暴力)
每日一题——博弈论(枚举与暴力)
17 1
每日一题——博弈论(枚举与暴力)
|
2月前
|
存储 人工智能 算法
每日练习——同余方程以及格雷码
每日练习——同余方程以及格雷码
15 1
|
2月前
|
C++
<iomanip>库中setw(),setfill()等函数的使用
<iomanip>库中setw(),setfill()等函数的使用
19 0
|
2月前
|
存储 人工智能 测试技术
每日练习之字符串——得分
每日练习之字符串——得分
14 0
|
3月前
L1-048 矩阵A乘以B
L1-048 矩阵A乘以B
32 0
|
3月前
L1-050 倒数第N个字符串
L1-050 倒数第N个字符串
19 0
|
2月前
|
关系型数据库 分布式数据库 数据库
阿里云618创新加速季数据库分会场全攻略
2024年阿里云618创新加速季活动已开启,数据库分会场推出多重优惠。RDS MySQL低至1折,部分产品享超值首购优惠,三个月仅需1折,续费也有折扣。此外,每天10点还有限时秒杀活动,云产品低至6.5折。新用户在新人专区购买指定规格可享首年折扣,还有数据库上云组合购优惠和开发者动手实践奖励。企业用户可申请5亿算力补贴,加速数字化转型。更多活动详情和优惠信息,可访问官方活动页面了解。
|
2月前
|
NoSQL 关系型数据库 应用服务中间件
jdk1.8、mysql、redis、nginx centos云服务器安装配置
jdk1.8、mysql、redis、nginx centos云服务器安装配置
|
2月前
|
前端开发 Java 关系型数据库
在Spring3 MVC中五步配置集成注解方式Hibernate3
在Spring3 MVC中五步配置集成注解方式Hibernate3
34 3
|
2月前
|
C语言
每日刷题——杭电2156.分数矩阵和杭电2024.C语言合法标识符
每日刷题——杭电2156.分数矩阵和杭电2024.C语言合法标识符
20 1