C++高精度算法详解:实现超大整数运算

一、高精度算法概述

在C++编程中,int型(-2147483648 ~ 2147483647)和long long型(-9223372036854775808~9223372036854775807)的数值范围有限。当处理超过19位的整数(如30位或200位的数字)时,常规数据类型无法存储,必须采用字符串输入+数组存储的方式处理,这种技术称为高精度算法。

二、高精度加法实现

核心步骤:

  1. 字符串转数字数组并逆序存储(低位对齐)

  2. 逐位相加并处理进位

  3. 去除前导零并输出结果

string A, B;
int a[40] = {0}, b[40] = {0}, sum[40] = {0};
cin >> A >> B; // 输入样例:1234567890314 5890235578899

// 字符串逆序转数字数组
int lenA = A.length();
for (int i = 0; i < lenA; i++) {
    a[lenA - i - 1] = A[i] - '0';
}
int lenB = B.length();
for (int i = 0; i < lenB; i++) {
    b[lenB - i - 1] = B[i] - '0';
}

// 逐位相加
int c = 0, lenS = 0; // 进位、结果长度
while (lenS < lenA || lenS < lenB) {
    sum[lenS] = (a[lenS] + b[lenS] + c) % 10;
    c = (a[lenS] + b[lenS] + c) / 10;
    lenS++;
}
sum[lenS] = c; // 处理最高位进位

// 输出结果(去除前导零)
if (c == 0) lenS--;
for (int i = lenS; i >= 0; i--) {
    cout << sum[i]; // 输出样例:1234573469213
}

三、高精度减法实现

核心步骤:

  1. 比较大小确定符号

  2. 逆序存储并处理借位

  3. 去除前导零并输出符号

string A, B;
int a[200] = {0}, b[200] = {0}, sub[200] = {0};
cin >> A >> B; // 输入样例:9999999999 9999999999999999999988

// 比较大小确定符号
int sign = 1;
if (A.length() < B.length() || (A.length() == B.length() && A < B)) {
    sign = -1;
    swap(A, B);
}

// 逆序转数组
int lenA = A.length();
for (int i = 0; i < lenA; i++) {
    a[lenA - i - 1] = A[i] - '0';
}
int lenB = B.length();
for (int i = 0; i < lenB; i++) {
    b[lenB - i - 1] = B[i] - '0';
}

// 逐位相减
int lenS = 0;
while (lenS < lenA || lenS < lenB) {
    if (a[lenS] < b[lenS]) {
        a[lenS] += 10;
        a[lenS + 1]--;
    }
    sub[lenS] = a[lenS] - b[lenS];
    lenS++;
}

// 输出结果
if (sign == -1) cout << '-';
while (lenS > 0 && sub[lenS] == 0) lenS--; // 去除前导零
for (int i = lenS; i >= 0; i--) {
    cout << sub[i]; // 输出样例:-9999999999989999999989
}

四、高精度乘法实现

核心步骤:

  1. 双循环逐位相乘

  2. 累加结果并处理进位

  3. 去除前导零

string A, B;
int a[104] = {0}, b[104] = {0}, m[204] = {0};
cin >> A >> B; // 输入样例:864 132

// 逆序转数组
int lenA = A.length();
for (int i = 0; i < lenA; i++) {
    a[lenA - i - 1] = A[i] - '0';
}
int lenB = B.length();
for (int i = 0; i < lenB; i++) {
    b[lenB - i - 1] = B[i] - '0';
}

// 逐位相乘累加
for (int j = 0; j < lenB; j++) {
    int c = 0; // 进位
    for (int i = 0; i < lenA; i++) {
        m[i + j] += a[i] * b[j] + c;
        c = m[i + j] / 10;
        m[i + j] %= 10;
    }
    m[j + lenA] = c; // 处理最高位进位
}

// 输出结果
int len = lenA + lenB;
while (len > 0 && m[len] == 0) len--; // 去除前导零
for (int i = len; i >= 0; i--) {
    cout << m[i]; // 输出样例:114048
}

五、算法总结

运算类型关键处理时间复杂度
加法进位处理、逆序对齐O(n)
减法借位处理、符号判断O(n)
乘法双重循环累加O(n²)

掌握高精度算法后,可处理任意长度整数运算,适用于密码学、大数据分析等领域。实际开发中需注意内存分配优化运算效率提升

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值